【SQL】DELETEで対象なし0件でもエラーにならない


ここではORACLEデータベースのSQLで、DELETE文を使って削除対象のレコードが0件の場合について紹介しています。

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

対象なしでも正常終了する

結論から言うと、DELETE文で削除対象のレコードがない0件の場合、SQLは正常終了します。

 

DELETE文を実行したけど、削除されない、データが消えないという場合はDELETE文が空振りしていることが考えられます。

DELETEの対象レコードが0件でもエラーや警告のメッセージは一切出力されません。「0件削除しました」となり正常終了します。

プログラミングを始めたときはびっくりしますが、SQL的に問題なければ正常に終了します。

プログラムやアプリケーションでDELETE文を実行したときも同じで、レコードが一切削除されない状態でも、SQL自体は正常終了するので、プログラムも正常終了することがあります。

DELETE文の空振りでよくあるのが、WHERE句の条件が間違っていて対象が0件になることです。

プログラムもSQL自体が正常終了しているので、滞りなく動き続けることもありますが、後々になって、データが削除されていなかったなど、トラブルの原因にもなります。

削除対象が0件のときの対処方法

DELETEを実行して削除対象が0件だと困る場合の対処方法を少し紹介します。

例えば、DELETEした件数を取得して、取得結果が0件の場合はアラートを出力したり、メールを飛ばす機能を構築するのも1つです。

他にも、削除されなかった場合はエクセプションをスローして、意図的に異常終了させることも1つです。

DELETEする前に、事前に削除の対象となるデータが存在するのか、チェックすることも有効です。

といった具合に、システムやプログラムの仕様や稼働条件に合わせて、対策を講じると0件で処理されるようなトラブルを回避することもできます。

また、システムやプロジェクト内で、このようなケースの対応方法が定められていることもあるので、事前に確認してみましょう。

DELETE結果が0件でもSQLが遅いことがあります

DELETEの対象レコードが0件でも、SQLの実行に時間がかかることもあります。

よくあるのはWHERE句の条件でたくさんのテーブルを参照したり、副問合せが多く複雑になっているときです。

削除する対象データを抽出するのに時間がかかっていることがあります。これについては、WHERE句の条件を書き換えるなどしてSQLをチューニングする必要があります。

SQLのチューニングについては「SELECT文のSQLチューニング方法まとめ」で解説しているのでぜひ参考にしてください。

まとめ

DELETE文は、削除対象レコードが0件でも正常終了します。エラーメッセージやアラートは一切出力されません。

削除対象がないと困るプログラムは、0件の場合に、アラートや例外を投げるなどして、処理を異常終了することも検討する必要があります。

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