我知道SELECT + INSERT是一种错误的做法,可能会导致争用条件(当一些人试图实现重新插入行为时,从insert-update反模式中学到的)。
但是,当我只在表中插入数据而不重复给定的列(或列的元组)时,我不知道如何避免这种情况:
IF NOT EXISTS ( SELECT TOP(1) 1 FROM [tbl_myTable] WHERE [MyNotKeyField] = 'myValue' )
BEGIN
INSERT INTO [tbl_myTable] (...) VALUES (...)
END我是否应该创建一个唯一的索引,然后尝试插入记录呢?我担心在这种情况下,失败的insert的开销可能会更高。
PS:我从客户端应用程序(与Server连接的C#应用程序)发送该命令,因此我认为临时表和合并的使用是不可能的。
发布于 2021-03-30 08:21:36
将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有一个关于反UPSERT模式的伟大的职位
https://stackoverflow.com/questions/66867130
复制相似问题