假设表结构为MyTable(KEY, datafield1, datafield2...)。
MyTable(KEY, datafield1, datafield2...)
通常我想更新现有记录,或者如果不存在则插入新记录。
本质上:
IF (key exists) run update command ELSE run insert command
写这个的最佳表现方式是什么?
不要忘记交易。性能很好,但是简单的(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