在我的存储过程中,我想检查以确保我尝试插入的内容尚未存在于表中。我已经尝试了下面的代码,但它似乎给了我误报(即使它不在表中也是如此)。还有更好的方法吗?
if not exists (select myID from tableName where myID = @myID and otherColumn = @otherColumn)
begin
insert into tableName
(
myID
, otherColumn
) values (
@myID
, @otherColumn
)
end
答案 0 :(得分:3)
两个想法。
首先,如果涉及NULL,那么“where exists”逻辑可能无法正常工作。
其次,我尝试将其作为一个声明(因为关系数据库的ACID属性),而不是弄乱事务,锁和他们的好朋友阻塞和死锁。以下陈述有效:
INSERT tableName (myId, otherColumn)
select @myId, @otherColumn
except select myId, otherColumn
from tableName
根据表格大小和/或索引问题,这可能对您不起作用;其他变种是可能的,具体取决于您的具体情况。
答案 1 :(得分:1)
可能是并发问题?如果是,请尝试创建事务并使用UPDLOCK提示选择数据。
答案 2 :(得分:1)
将 UPDLOCK 和 HOLDLOCK 提示添加到SELECT语句并使用事务
答案 3 :(得分:0)
我认为myID和otherColumn上有一个唯一的键。
如果是这样,有多大可能被竞争条件所破坏。很可能你只需要插入并处理任何异常或者更好,但只是允许异常被提升到调用者(毕竟它可能想要通知用户这种情况)。
答案 4 :(得分:0)
问题不在于if语句。遗憾的是,我的逻辑是将值发送到存储过程。