【问题标题】:SQL Insert With Unique Constraint using Stored Procedure使用存储过程的具有唯一约束的 SQL 插入
【发布时间】:2013-09-06 03:27:58
【问题描述】:

这是一个带有具体示例的通用问题。

我有一个包含三个字段(genreID (PK IDENTITY)、genre 和 subGenre)的表。该表对 (genre, subGenre) 组合具有唯一约束。

我想知道如果存储过程在表中不存在,我该如何修改要插入的存储过程,否则如果存在,则返回现有流派的流派ID。

CREATE PROCEDURE spInsertGenre
    @genreID int OUTPUT,
    @genre varchar(100),
    @subGenre varchar(100)= NULL
AS
BEGIN
    INSERT INTO Genre
    (
        genre,
        subGenre
    )
    Values (
        @genre,
        @subGenre
    )

    SELECT @genreID = SCOPE_IDENTITY()
END
GO

【问题讨论】:

    标签: sql stored-procedures insert sql-server-2008-r2 unique-constraint


    【解决方案1】:

    您可以尝试在插入之前选择您的 SP 将插入的行:

    CREATE PROCEDURE spInsertGenre
        @genreID int OUTPUT,
        @genre varchar(100),
        @subGenre varchar(100)= NULL
    AS
    BEGIN
        -- if the row to be inserted already exists, put the genreID into the @genreID output parameter 
        SELECT @genreID = genreID
        FROM Genre 
        WHERE genre = @genre 
        AND subGenre = @subGenre
    
        IF @genreID IS NULL -- if the genreID was not found, do an insert and select the new genreID to the @genreID output parameter
        BEGIN
            INSERT INTO Genre
            (
                genre,
                subGenre
            )
            Values (
                @genre,
                @subGenre
            )
    
            SELECT @genreID = SCOPE_IDENTITY()
        END
    END
    GO
    

    【讨论】:

    • +1,而且,请务必将 select 和 insert 放在单个事务中,方法是将其包装在 BEGIN TRANSACTION 和 COMMIT TRANSACTION 中。否则,如果存储过程同时执行多次,可能会出现重复记录。
    • 我测试过 - 它有效......不过我很好奇,插入约 5,000 条记录的时间是 16 秒,没有 SELECT 语句,还有 16 秒的 SELECT 语句 --- 我只是想知道为什么这里没有速度损失(允许我在从 0 条记录开始的表中插入 5k 条记录,并且没有尝试插入重复项)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多