佐々木屋

技術的なことから趣味まで色々書きます

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')

状況に応じて使い分けて下さい。