INSERTかUPDATEかをSELECTで確認せずに実行する方法
SQL-Serverにてテーブルにデータを追加する場合の方法を考えます。
「絶対にキー重複しない」のであれば、単純にINSERTすればいいのですが、キー重複する可能性がある場合エラーとなりトランザクションが失敗する恐れがあります。
方法① DELETE→INSERT
俗に言う、DeleteWriteする手法です。手法といえるのか?ですが・・・。単純にDELETEとINSERTをトランザクションで実行すれば良いのです。
DELETE FROM テーブルA WHERE ID = 1 INSERT INTO テーブルA (ID,値) VALUES (1,'HogeHoge')
なお、;でSQL文をつなげて、
DELETE FROM テーブルA WHERE ID = 1; INSERT INTO テーブルA (ID,値) VALUES (1,'HogeHoge')
のように実行してしまうと、DELETEは成功してINSERTが失敗した場合後戻りできませんので、トランザクションで実行した方が良いです。
方法② UPDATE更新処理行数結果で判断
@@ROWCOUNTで直前のステートメント処理行数(影響があった行数)を取得することが可能です。この数が0であれば「更新する行が無い=INSERT出来る」という判断となります。
UPDATE テーブルA SET 値 = 'HogeHoge' WHERE ID = 1 IF @@ROWCOUNT = 0 INSERT INTO テーブルA (ID,値) VALUES (1,'HogeHoge')
状況に応じて使い分けて下さい。