【问题标题】: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 语句中添加 UPDLOCK 和 HOLDLOCK 提示并使用事务
【解决方案4】:
我认为 myID 和 otherColumn 上有一个唯一键。
如果是这样,它被竞争条件破坏的可能性有多大。可能您只需要进行插入并处理任何异常,或者可能更好,但只允许向调用者提出异常(毕竟它可能想通知用户这种情况)。
【解决方案5】:
问题不在于 if 语句。可悲的是,我的逻辑是向存储过程发送值。