小编典典

在SQL Server上执行INSERT或UPDATE的解决方案

sql

假设表结构为MyTable(KEY, datafield1, datafield2...)

我经常想更新现有记录,或者如果不存在则插入新记录。

本质上:

IF (key exists)
  run update command
ELSE
  run insert command

编写此代码的最佳方式是什么?


阅读 185

收藏
2021-05-05

共1个答案

小编典典

不要忘记交易。性能很好,但是简单的(IF EXISTS ..)方法非常危险。
当多个线程尝试执行插入或更新时,您很容易会遇到违反主键的情况。

@Beau Crawford和@Esteban提供的解决方案显示了总体思路,但容易出错。

为了避免死锁和PK违规,您可以使用以下方法:

begin tran
if exists (select * from table with (updlock,serializable) where key = @key)
begin
   update table set ...
   where key = @key
end
else
begin
   insert into table (key, ...)
   values (@key, ...)
end
commit tran

或者

begin tran
   update table with (serializable) set ...
   where key = @key

   if @@rowcount = 0
   begin
      insert into table (key, ...) values (@key,..)
   end
commit tran
2021-05-05