【SQL】DELETE-INSERTとUPDATEの違いや注意点


ここではORACLEデータベースのSQLで、DELETE-INSERTとUPDATEの違いや使い分けについて簡単に紹介しています。

DELETE文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】DELETE文の書き方:サンプル多数あり

DELETE-INSERTとUPDATEを比較する理由

DELETE-INSERTとUPDATEを比較する理由は、書き方や実行方法が違いますが、条件によってはどちらも同じ結果を得ることも出来るからです。

例えば、次のUPDATE文では、COL1列の値が00001のレコードのCOL2列の値をAに更新しています。

UPDATE tab1 SET col2 = 'A' WHERE col1 = '00001';

上記のSQLはDELETE-INSERTでも再現可能です。次のSQLでは一度、レコードを削除してから、再度INSERTし直します。

DELETE FROM tab1 WHERE col1 = '00001';
INSERT INTO tab1 VALUES('00001','A');

結果的には同じ値のレコードが生成されるので、どちらの手段を取るか検討することがあります。

DELETE-INSERTとUPDATEの使い分け

DELETE-INSERTとUPDATE文の使い分けを少し解説したいと思います。

UPDATE文を使う場合

レコードの列の値を更新する場合は、UPDATE文を使います。

DELETEする必要がない限り、基本はUPDATEを使うことが多いです。

DELETE-INSERTは、一度レコードを削除します。削除した条件が間違っているとトラブルの原因にもなります。

さらにDELETE-INSERTはSQLを少なくとも2回実行することになるので、処理時間がかかる可能性もあります。

DELETE-INSERTを使う場合

DELETE-INSERTを使うのは、レコードを一度削除した方が都合が良いというときです。

例えば、日次のバッチ処理で外部ファイルを受信し、内部テーブルに登録するときです。前日分のレコードを削除してから、INSERTするときには、UPDATEではなく、DELETE-INSERTを使います。

既存のレコードを更新するときは、削除する必要がないので、DELETE-INSERTはあまり使いません。

DELETE-INSERTとUPDATEの違いや注意点

DELETE-INSERTとUPDATEの違いや注意点について簡単に解説します。

1.既存のレコードの内容を保持する手間がかかる

基本的には、UPDATE文よりもDELETE-INSERTの方が手間がかかります。

DELETE-INSERTでは、削除したレコードの既存の内容をINSERTする場合、プログラム内で値を保持するか、ワークテーブルで保持しておくなど、手間がかかります。

さらに登録日や更新日など、項目が分かれていると、その項目ごとに登録の仕様と保持の仕方を考える必要があるので、手間がかかります。

2.コミットのタイミングやリランに注意

プログラムを組むときには、コミットのタイミングやプログラムが異常終了した場合に再実行できるかを検討しておく必要があります。

当たり前のことですが、DELETE-INSERTとUPDATEでは、実行しているSQLが違います。

・DELETE-INSERT:DELETE文とINSERT文
・UPDATE:UPDATE文

DELETE文とINSERT文では、DELETEとINSERTを同じプログラムに書くか、別々にするか検討も必要です。

DELETEとINSERTを同じプログラムに書きジョブ終了時にコミットした場合、リランしたとき、DELETEからやり直すので時間がかかることになります。

DELETEとINSERTを別々のプログラムに書いた場合やDELETE完了時点でコミットした場合、テーブルが空の状態で他のプログラムに影響がないか確認が必要です。

3.SQLの実行回数や処理時間に注意が必要

DELETE-INSERTとUPDATEでは、SQLの実行回数が変わってきます。

最もシンプルな場合、DELETE-INSERTが2回、UPDATEだと1回とDELETE-INSERTの方がSQLの実行回数が増えます。

実行する条件次第ですが、SQLの実行回数が増えると処理に時間がかかることも考えられます。

まとめ

DELETE-INSERTとUPDATEでは、削除する要件がない限りUPDATEを使うことをおすすめします。バッチ処理などで削除する要件がある場合はDELETEとINSERTを使う。

DELETEとINSERTとUPDATEでは、既存レコードの値の保持や処理構成、処理時間に違いがあり、注意が必要です。

他にも、DELETE文の様々な書き方を解説しております。
詳しくは「【SQL】DELETE文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。