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 .
合并 EXISTS
与 INSERT
例如
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 模式
我知道 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 .
合并 EXISTS
与 INSERT
例如
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 模式