※当サイトの記事には、広告・プロモーションが含まれます。

Oracle DatabaseのDELETE文がエラーも出さずにハングアウトする件

gigazine.net

⇧「ガタカ」は名作ですね。

Oracle DatabaseのDELETE文がエラーも出さずにハングアウトする件

相変わらずの不親切さを発揮してくださるOracle Databaseさん。

DELETE文が一向に終わる気配が無くて、何かしらロックされてるセッションがあるのかとか疑ったりしてたんだけど、特にロックされてるようなセッションも無く...

試しに、TRUNCATEを実行したら、

『ORA-02266:
表には有効な外部キーによって参照される一意キー/主キーが含まれています。』

ってエラーが出たんですよ。

※実際の開発現場では、TRUNCATEは実行しても良いか必ず確認を取ってから行うようにしましょう。

oracle-chokotto.com

TRUNCATEは表のデータを削除するという事ではDELETEと変わりませんが、表のデータは全て削除されてしまいます。また、TRUNCATEを実行後に「やっぱり元に戻したい」という事になってもROLLBACKでは戻せません。

ORACLE/削除編 - オラクルちょこっとリファレンス

これは、TRUNCATEで削除した時はREDOログに削除した履歴が記録されないためなのですが、ログを記録しないためDELETEよりも早く削除を完了させる事が可能です。

ORACLE/削除編 - オラクルちょこっとリファレンス

TRUNCATE実行後に取消(ROLLBACK)できないので、慎重に実行する必要があります。

ORACLE/削除編 - オラクルちょこっとリファレンス

話が脱線しましたが、で、調べたところ、

it-memo.info

⇧ 上記サイト様に依りますと、別テーブルで外部キーとして参照されてることが原因らしいですと。

というか、DELETE文で同じエラーを出してくれれば良いものを、安定の不親切さを発揮するOracle Databaseさん...

外部キーを持ってるテーブルを確認してみました。

⇧ 3つのテーブルが外部キーを持っておりました。

外部キーを無効化したところ、DELETE文が実行できました。

で、外部キーを再び有効化しようとして、エラー。

どうやら、外部キーとして参照されるテーブルが空なのに

外部キーを保持する側のテーブルにレコードが残ってるのが原因らしい。

関係データベース管理システム (RDBMS) あるいは SQL データベース管理システム (SQL DBMS) は参照整合性制約を強制適用するため、DBMSは参照される側の関係変数(表)の組が削除(あるいは更新)される場合でも、データ整合性参照整合性)を維持しなければならない。 その際、参照する側の関係変数に組が残っている場合、参照整合性はよく考慮しなければならない。

外部キー - Wikipedia

データベース言語標準 SQL:2003 ではそのような場合に発生させる5種類の参照操作を規定している。

外部キー - Wikipedia

⇧ ということらしいのだけど、

products.sint.co.jp

外部キーとは?

外部キーとは「親テーブルに存在しないデータを子テーブルが持つことが無いようにするための制約」です。

外部キーとは?〜概要から変数や処理の書き方を解説〜

⇧ なるほど。

バックアップ用のテーブルだから、まぁ、外部キーを有効化できなくても良しとしておくことにします。

それにしても、Oracle Databaseさん、DELETE文の実行でTRUNCATE実行時と同じエラーを出して指摘してくれれば話は早いんだが...

TRUNCATEを実行しなきゃエラーを出して指摘してくれないってのは辛すぎる...

毎度モヤモヤ感が半端ない...

今回はこのへんで。