(私の答えは以下ですが、それ以降はより良い質問があります)&答えはInsert into a MySQL table or update if existsです
あなたは行が存在するかどうかをチェックして、INSERTまたはUPDATEが、これは、あなたが1つではなく、2つのSQL操作を実行することが保証されますができます。
- チェックを行は
- 挿入または更新行
が存在する場合
より良い解決策は、常に最初に更新することで、何行が更新されなかった場合は、そのようにように、INSERTを実行します。
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
if @@ROWCOUNT = 0
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
これは、行がすでに存在するかどうかに応じて、1つのSQL操作または2つのSQL操作を行います。
パフォーマンスが実際に問題になる場合、操作がINSERTまたはUPDATEの可能性が高いかどうかを判断する必要があります。 UPDATEの方が一般的な場合は、上記を行います。 INSERTの方が一般的であれば、逆にすることもできますが、エラー処理を追加する必要があります。
BEGIN TRY
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
END TRY
BEGIN CATCH
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
END CATCH
あなたがUPDATEまたはINSERTを行う必要がある場合、あなたは、単一のトランザクション内で2つの操作を行う必要が本当にある特定のことができます。理論的には、最初のUPDATEまたはINSERT(またはEXISTSチェック)の直後、次のINSERT/UPDATEステートメントの前に、データベースが変更されていて、2番目のステートメントが失敗する可能性があります。これは非常に稀であり、トランザクションのオーバーヘッドはそれに値するものではないかもしれません。
また、MERGEという単一のSQL操作を使用してINSERTまたはUPDATEを実行することもできますが、これはおそらくこの1行操作の過剰な操作です。
約SQL transaction statements、race conditions、についてお読みください。
** MERGE節**を使用すると、それと一緒にユーザーの詳細を示す一時表が表示されますか?これはいい? –
Sakhile - そうです - 答えはどこですか?答えはどこですか? –
'MERGE'はこのユースケースには適していますが、SQL Server 2008でのみ導入されたことに注意してください(おそらくOPはまだ6年後の2005年をまだ使用していません)。 –