SQL Server 上的 INSERT OR UPDATE 解决方案

新手上路,请多包涵

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

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

本质上:

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

写这个的最佳执行方式是什么?

原文由 Chris Cudmore 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

不要忘记交易。性能很好,但简单的(如果存在..)方法非常危险。

当多个线程将尝试执行插入或更新时,您很容易得到主键违规。

@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

原文由 aku 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用:

 INSERT INTO tableName (...) VALUES (...)
ON DUPLICATE KEY
UPDATE ...

使用这个,如果已经有一个特定键的条目,那么它将更新,否则,它将插入。

原文由 Jay 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进