【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文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。