2

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

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
4

2 に答える 2

0

MERGEステートメントを使用するか (T-SQL を使用している場合)、キーの存在に基づいて INSERT または UPDATE を実行するクエリを作成できます。

編集:OPは彼の質問を編集しました。はい、技術的には、このクエリが実行されるたびに UPDATE と INSERT を実行しますが、どの基準が満たされているかに応じて、これらのステートメントのいずれかでテーブルに触れるだけです。

于 2011-08-31T19:23:17.660 に答える