サイトアイコン SE日記

【SQL】UPDATE文で更新対象なし0件でもエラーにならない


このページでは、ORACLEデータベースのSQLで、UPDATE文を実行してとき、更新対象がない場合、更新対象なしで更新結果が0件となる場合について、解説していきます。

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

UPDATEしたレコードが0件でも正常終了する

結論から言うと、UPDATEで更新対象がない0件の場合、SQLは正常終了します。

エラーや警告のメッセージは一切出力されません。特にプログラムを始めたときはびっくりしますが、SQL的に問題なければ正常に終了します。

仮に、プログラムで、UPDATE文を実行した場合も同じです。SQL自体は正常終了するので、更新結果が0件でもプログラムも正常終了することがあります。

よくあるのが、WHERE句の条件が間違っていて更新対象が0件になる場合です。

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

UPDATEの更新対象が0件のときの対処方法

UPDATEした更新対象が0件だと困る場合の対処方法を少し紹介します。

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

後続の処理が実行されるとまずいようなバッチ処理の場合では、エクセプションをスローして、意図的にABENDさせることも1つです。

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

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

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

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

UPDATEの更新対象が結果的に0件でも、数時間もSQLが実行されることがあります。

よくあるのが、WHERE句の条件式に副問合せでたくさんのテーブルを記述しているときです。

更新対象レコードを抽出するのに、長時間を要していることがあります。これについては、副問合せのSELECT文をチューニングしてレコードの探索時間の短縮を図る必要があります。

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

まとめ

INSERT文は、レコードの更新対象がない0件の場合でも、正常終了します。エラーメッセージやアラートは一切出力されません。

更新件数が0件だと困るプログラムは、0件の場合に、アラートや意図的に例外を投げるなどして、処理を止めることも検討する必要があります。

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

モバイルバージョンを終了