2

我有一个不想跟踪的过程是创建还是更新。跟踪会很复杂。我想执行创建或更新。架构就像...

col1 varchar() (PK)
col2 varchar() (PK)
col3 varchar() (PK)
col4 varchar()

我正在考虑做

TRY
{
    INSERT ...
}
CATCH(DuplicateKeyException)
{
    UPDATE ...
}

你有什么建议?


我想确保我理解另一个投票最多的答案。给定我的模式,更新总是发生(即使有插入),但插入只发生在它不存在的地方?

 //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
4

2 回答 2

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)

我认为它比首先检查存在要快。

于 2011-08-31T19:50:53.427 回答
0

您可以使用MERGE语句(如果您使用的是 T-SQL)或构建一个查询,根据您的密钥的存在执行 INSERT 或 UPDATE。

编辑:OP 编辑​​了他的问题。是的,从技术上讲,每次执行此查询时,您都会运行 UPDATE 和 INSERT,但您只会使用其中一个语句来处理表,具体取决于满足哪些条件。

于 2011-08-31T19:23:17.660 回答