行が存在するかどうかを確認してから、INSERT または UPDATE を実行できますが、これにより、1 つではなく 2 つの SQL 操作を実行することが保証されます。
- 行が存在するかどうかを調べる
- 行の挿入または更新
より良い解決策は、常に最初に UPDATE を行い、行が更新されていない場合は、次のように 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 を実行する必要があるかどうかを確実にするには、1 つの TRANSACTION 内で 2 つの操作を実行する必要があります。理論的には、最初の UPDATE または INSERT (または EXISTS チェック) の直後であるが、次の INSERT/UPDATE ステートメントの前に、データベースが変更され、2 番目のステートメントがいずれにせよ失敗する可能性があります。これは非常にまれであり、トランザクションのオーバーヘッドはそれに値しない場合があります。
別の方法として、MERGE と呼ばれる単一の SQL 操作を使用して INSERT または UPDATE を実行することもできますが、これも、この 1 行の操作にはおそらくやり過ぎです。
SQL トランザクション ステートメント、競合状態、SQL MERGE ステートメントについて読むことを検討してください。