SQL 服务器如果不存在则插入

SQL Server Insert if not exist

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

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

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

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

PS:我正在从客户端应用程序(与 SQL 服务器连接的 C# 应用程序)发送该命令,所以我认为临时 table 并且无法使用 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 有一个 great post 反 UPSERT 模式