SQL Server插入(如果不存在)



我知道SELECT+INSERT是一种糟糕的做法,可能会导致竞争条件(当一些人试图实现upstart行为时,从插入-更新反模式中学到(。

但是,当我只在表中插入数据而不重复给定列(或列的元组(时,我不知道如何避免这种情况:

IF NOT EXISTS ( SELECT TOP(1) 1 FROM [tbl_myTable] WHERE [MyNotKeyField] = 'myValue' )
BEGIN
INSERT INTO [tbl_myTable] (...) VALUES (...)
END

我应该创建一个唯一的索引,然后尝试插入记录吗?恐怕在这种情况下,插入失败的开销可能会更高。

PS:我从客户端应用程序(与SQL Server连接的C#应用程序(发送该命令,所以我认为临时表和MERGE的使用是不可能的。

组合EXISTSINSERT

例如

INSERT INTO [tbl_myTable] (...) 
SELECT @val1, @val2 ...
WHERE NOT EXISTS
(
SELECT 1 FROM [tbl_myTable] WITH (UPDLOCK, SERIALIZABLE)
WHERE [MyNotKeyField] = 'myValue'
);

Aaron Bertrand有一篇关于反UPSERT图案的伟大文章

相关内容

最新更新