SQL Server 如果不存在则插入

Ska*_*ary 1 c# sql sql-server insert

我知道 SELECT + INSERT 是一种不好的做法,可能会导致竞争条件(当一些尝试实现 upsert 行为时从插入更新反模式中学到)。

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

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

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

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

Gee*_*zer 5

结合EXISTSINSERT

例如

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

Aaron Bertrand 有一篇关于反 UPSERT 模式的精彩文章