插入存储过程之前检查是否存在
问题描述:
在我的存储过程中,我想检查一下以确保我试图插入的内容不存在于表中。我已经尝试了下面的代码,但它似乎给了我误报(即使它不在表格中也是如此)。有没有更好的办法?插入存储过程之前检查是否存在
if not exists (select myID from tableName where myID = @myID and otherColumn = @otherColumn)
begin
insert into tableName
(
myID
, otherColumn
) values (
@myID
, @otherColumn
)
end
答
问题不在于if语句。可悲的是,我的逻辑是将值发送到存储过程。
答
也许是一个并发问题?如果是这样,尝试创建一个事务并使用UPDLOCK提示选择数据。
答
添加UPDLOCK和HOLDLOCK提示,以你的SELECT语句和使用事务
答
两个念头。
首先,如果涉及NULL,您的“where exists”逻辑可能无法正常工作。其次,我会尝试使它成为一个声明(因为关系数据库的ACID属性),而不是混淆事务,锁和他们的好朋友阻塞和死锁。以下声明有效:
INSERT tableName (myId, otherColumn)
select @myId, @otherColumn
except select myId, otherColumn
from tableName
根据表大小和/或索引问题,这可能不适用于您;其他变体也是可能的,这取决于你的情况。
答
我认为它有一个独特的关键,超过myID和其他列。
如果是这样,它有多大可能被竞争条件所打破。可能你只需要执行插入操作,并且更好地处理任何异常或可能性,只是允许将异常提交给调用者(毕竟它可能想通知用户这种情况)。