「整合性制約」タグアーカイブ

Oracle「ORA-02292:整合性制約が違反しています」の原因と解決法

データ削除(DELETE)や更新(UPDATE)を行った際に、次のようなエラーが発生したことはありませんか?

ORA-02292: 整合性制約 (制約名) が違反されています - 子レコードが見つかりました。

このエラーは、「削除しようとしたデータが別のテーブルから参照されているため、勝手に消せません」という意味になります。本記事では、エラーの原因と解決方法を実例付きでわかりやすく解説します。


✅ ORA-02292とは?エラーの意味をわかりやすく解説

ORA-02292エラーは、外部キー(FOREIGN KEY)による整合性制約に違反したときに発生します。

つまり、

✅ 親テーブルのレコードを削除 or 更新しようとした
✅ でも、そのデータを参照している子テーブルのデータが存在している
✅ そのため削除・更新できず、エラーになる

という状況です。


✅ エラーが発生する典型的な例

📘 テーブル構成(例)

テーブル名内容備考
EMP社員マスタ親テーブル
SALARY給与履歴子テーブル(EMP_IDを参照)

このEMP_ID = ‘E001’ の社員が SALARY テーブルに登録されている場合、以下のエラーが発生します。

ORA-02292: 整合性制約 (HR.SALARY_FK) が違反されています - 子レコードが見つかりました

✅ 原因を確認する方法(参照関係を特定)

✅ どのテーブルから参照されているのかを確認

このSQLで、外部キー制約の一覧を確認できます。


✅ 解決方法4パターン(状況に応じて選択)

方法解決内容利用シーン注意点
① 子テーブルを先に削除手動で削除一時的に消す場合データ消失に注意
② 外部キーをNULL許可にUPDATE対応可柔軟な参照解除用設計による
③ ON DELETE CASCADEを設定親削除で自動削除自動削除したい場合子も消える
④ 制約を一時的に無効化一時的に制約OFF大量データ移行時使い方注意

✅ 解決方法の実例SQL

✅ ① 子テーブルのデータを先に削除


✅ ② 外部キー制約をNULL許可に変更


✅ ③ 親削除時に子も自動削除(ON DELETE CASCADE)


✅ ④ 一時的に制約を無効化(※使用注意)


✅ よくある質問(FAQ)

❓ UPDATEでも発生する?

はい。親キーを変更して子テーブルとの整合性が崩れる場合にも発生します。

❓ 本当に削除して良いかわからない…

業務データでは「子テーブルに履歴が残っている=重要なデータ」のケースも多いため、安易な削除は避けましょう。


✅ まとめ:削除順序と制約を理解することが鍵!

抑えるポイント内容
エラー原因子テーブルに参照されている
重要事項削除順序「子→親」
推奨対策ON DELETE CASCADEの活用も検討