何かが作成か更新かを追跡したくないプロセスがあります。追跡は複雑になります。作成または更新を実行したいと考えています。スキーマは次のようになります...
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