假设表结构为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