【问题标题】:check for existence before insertion in stored procedure在插入存储过程之前检查是否存在
【发布时间】:2010-02-15 14:21:16
【问题描述】:

在我的存储过程中,我想检查以确保我尝试插入的内容不存在于表中。我已经尝试了下面的代码,但它似乎给了我误报(即使它不在表格中,也就是真的)。有没有更好的办法?

if not exists (select myID from tableName where myID = @myID and otherColumn = @otherColumn)
begin
    insert into tableName
        (
            myID
            , otherColumn
        ) values (
            @myID
            , @otherColumn
        )
end

【问题讨论】:

    标签: sql-server sql-server-2005 tsql stored-procedures


    【解决方案1】:

    两个想法。

    首先,如果涉及 NULL,您的“存在位置”逻辑可能无法按您的意愿工作。

    其次,我会尝试使其成为一个语句(因为关系数据库的 ACID 属性),而不是搞乱事务、锁以及它们的好朋友阻塞和死锁。以下语句有效:

    INSERT tableName (myId, otherColumn)
     select @myId, @otherColumn
     except select myId, otherColumn
      from tableName
    

    这可能不适合您,具体取决于表大小和/或索引问题;其他变体也是可能的,具体取决于您的情况。

    【讨论】:

      【解决方案2】:

      可能是并发问题?如果是这样,请尝试创建一个事务并使用 UPDLOCK 提示选择数据。

      【讨论】:

        【解决方案3】:

        在您的 SELECT 语句中添加 UPDLOCKHOLDLOCK 提示并使用事务

        【讨论】:

          【解决方案4】:

          我认为 myID 和 otherColumn 上有一个唯一键。

          如果是这样,它被竞争条件破坏的可能性有多大。可能您只需要进行插入并处理任何异常,或者可能更好,但只允许向调用者提出异常(毕竟它可能想通知用户这种情况)。

          【讨论】:

            【解决方案5】:

            问题不在于 if 语句。可悲的是,我的逻辑是向存储过程发送值。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多