Oracle Database を利用していると、
INSERT や UPDATE 実行時に ORA-02291: 整合性制約違反(親キーがありません) というエラーに遭遇することがあります。
本記事では、
-
ORA-02291 の意味
-
よくある発生原因
-
実務で使える対処法
-
SQL 例を交えた確認手順
をわかりやすく解説します。
ORA-02291 エラーの意味
ORA-02291 は、
外部キー制約(FOREIGN KEY)に違反した状態でデータを登録・更新しようとした
場合に発生するエラーです。
簡単に言うと、
子テーブルに登録しようとした値が、親テーブルに存在しない
という状態です。
発生しやすい典型例
テーブル構成例
エラーが発生する SQL
|
1 2 3 |
INSERT INTO employees (emp_id, dept_id) VALUES (1, 999);<code class="whitespace-pre! language-sql"> |
※ departments.dept_id = 999 が存在しない場合、
ORA-02291 が発生します。
ORA-02291 が発生する主な原因
原因① 親テーブルに該当データが存在しない
最も多い原因です。
-
親テーブルへの INSERT 忘れ
-
マスタデータ未登録
-
テスト環境での初期データ不足
原因② データ登録の順序が逆
バッチ処理や一括登録でよく発生します。
原因③ 親データが削除されている
-
DELETE 実行済み
-
論理削除ではなく物理削除している
-
他処理が先に削除している
原因④ UPDATE による外部キー変更
|
1 2 3 4 |
UPDATE employees SET dept_id = 999 WHERE emp_id = 1;<code class="whitespace-pre! language-sql"> |
→ 更新後の値が親テーブルに存在しない場合も発生します。
制約名(どの外部キーか)を確認する方法
エラーメッセージには制約名が含まれています。
|
1 |
ORA-02291: integrity constraint (SCHEMA.FK_EMP_DEPT) violated |
制約の詳細確認 SQL
|
1 2 3 4 |
SELECT constraint_name, table_name, r_constraint_name FROM user_constraints WHERE constraint_name = 'FK_EMP_DEPT';<code class="whitespace-pre! language-sql"> |
親テーブルを確認する場合:
|
1 2 3 4 5 6 7 8 |
SELECT constraint_name, table_name FROM user_constraints WHERE constraint_name = ( SELECT r_constraint_name FROM user_constraints WHERE constraint_name = 'FK_EMP_DEPT' );<code class="whitespace-pre! language-sql"> |
実務での対処法まとめ
対処法① 親テーブルにデータを先に登録する
|
1 2 |
INSERT INTO departments (dept_id) VALUES (999);<code class="whitespace-pre! language-sql"> |
その後、子テーブルを登録します。
対処法② 登録順序を見直す
-
バッチ処理
-
CSV 取込
-
アプリの登録ロジック
必ず「親 → 子」の順序になっているか確認しましょう。
対処法③ 親データの存在チェックを行う
|
1 2 3 4 |
SELECT 1 FROM departments WHERE dept_id = :dept_id;<code class="whitespace-pre! language-sql"> |
INSERT / UPDATE 前の事前チェックとして有効です。
対処法④ 外部キー制約を一時的に無効化(※注意)
|
1 2 |
ALTER TABLE employees DISABLE CONSTRAINT fk_emp_dept;<code class="whitespace-pre! language-sql"> |
|
1 |
ALTER TABLE employees ENABLE CONSTRAINT fk_emp_dept; |
⚠ 本番環境では非推奨
データ不整合の原因になるため、慎重に判断してください。
よくある勘違い
-
❌ 「PRIMARY KEY のエラー」
-
❌ 「NOT NULL 制約違反」
👉 **ORA-02291 は必ず「外部キー制約違反」**です。
まとめ
-
ORA-02291 は 親テーブルに存在しないキーを子テーブルで使った時 に発生
-
原因の大半は
-
親データ未登録
-
登録順序ミス
-
親データ削除
-
-
制約名を確認すると原因特定が早い
-
原則は 親 → 子の登録順を守ること
ORA-xxxx 系エラーは 「意味を正しく理解すれば怖くない」 ものがほとんどです。
本記事がトラブルシューティングの時短に役立てば幸いです。

