我有一个流程,我不想跟踪某些内容是创建还是更新。跟踪会很复杂。我想执行创建或更新。架构就像......
col1 varchar() (PK)
col2 varchar() (PK)
col3 varchar() (PK)
col4 varchar()
我正在考虑做
TRY
{
INSERT ...
}
CATCH(DuplicateKeyException)
{
UPDATE ...
}
你有什么建议?
我想确保我理解其他最高投票的答案。给定我的模式,UPDATE总是会发生(即使使用INSERT),但插入只发生在它不存在的地方?
//UPSERT
INSERT INTO [table]
SELECT [col1] = @col1, [col2] = @col2, [col3] = @col3, [col4] = @col4
FROM [table]
WHERE NOT EXISTS (
-- race condition risk here?
SELECT 1
FROM [table]
WHERE [col1] = @col1
AND [col2] = @col2
AND [col3] = @col3
)
UPDATE [table]
SET [col4] = @col4
WHERE [col1] = @col1
AND [col2] = @col2
AND [col3] = @col3
答案 0 :(得分:6)
update table1 set col1=1,col2=2,col3=3 where a=1
if @@ROWCOUNT=0
insert into table1 (col1,col2,col3) values (1,2,3)
我认为这比先检查存在要快。
答案 1 :(得分:0)
您可以使用MERGE语句(如果您使用的是T-SQL)或根据密钥的存在构建执行INSERT或UPDATE的查询。
修改:OP已编辑了他的问题。是的,从技术上讲,每次执行此查询时,您都将运行UPDATE和INSERT,但是您只能根据满足的条件使用其中一个语句触摸表。