假设表结构为MyTable(KEY, datafield1, datafield2...)。
MyTable(KEY, datafield1, datafield2...)
通常我想更新现有记录,或者如果它不存在则插入一条新记录。
本质上:
IF (key exists) run update command ELSE run insert command
写这个的最佳执行方式是什么?
不要忘记交易。性能很好,但简单的(如果存在..)方法非常危险。 当多个线程将尝试执行插入或更新时,您很容易得到主键违规。
@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