ORA-02449エラーは、主キーまたは一意キーが、別の表の外部キー制約から参照されている状態で削除しようとした場合に発生します。
対処方法は次のいずれかです。
- 参照している外部キー制約を特定する
- 外部キー制約を削除または無効化する
- その後で主キーまたは一意キーを削除する
本記事では、外部キーで参照している子テーブルの一覧を確認する方法と、正しい削除手順をSQL例つきで解説します。
ORA-02449とは何か
ORA-02449は、次のような操作を行ったときに発生します。
・主キーを削除しようとした
・一意キーを削除しようとした
・インデックスと誤認して制約を削除しようとした
原因は共通しており、削除対象の制約が、別テーブルの外部キー制約から参照されているためです。
例
親テーブル:EMP
子テーブル:EMP_DETAIL
EMP.ID(主キー)を削除しようとすると、EMP_DETAIL.EMP_ID(外部キー)が参照しているためエラーになります。
ORA-02449は「外部キーが参照しているため制約を削除できない」ケースですが、似た状況でよく出るのがORA-02292(整合性制約違反)です。削除や更新で止まる原因と、子テーブル側のデータ・制約をどう確認するかは、次の記事で具体例つきで解説しています。
ORA-02449が発生する代表的な操作
| 操作内容 | 発生理由 |
|---|---|
| 主キー制約の削除 | 外部キーが参照している |
| 一意キー制約の削除 | 外部キーが参照している |
| DROP TABLE | 参照関係が残っている |
| インデックス削除と誤認 | 実体は制約だった |
外部キー参照している子テーブルを確認する方法

まず、削除対象の主キーまたは一意キーが、どの外部キーから参照されているかを確認します。
主キー・一意キーの制約名を確認
|
1 2 3 4 |
SELECT constraint_name FROM user_constraints WHERE table_name = '親テーブル名' AND constraint_type IN ('P', 'U'); |
constraint_type
P:主キー
U:一意キー
参照している外部キー制約の一覧を取得
|
1 2 3 4 5 6 7 8 9 |
SELECT a.constraint_name AS 外部キー制約名, a.table_name AS 子テーブル名, a.column_name AS 子カラム名 FROM user_cons_columns a JOIN user_constraints b ON a.constraint_name = b.constraint_name WHERE b.constraint_type = 'R' AND b.r_constraint_name = '親制約名'; |
r_constraint_name に、削除したい主キーまたは一意キーの制約名を指定します。
これにより、どのテーブルのどの列が参照しているかを正確に把握できます。
外部キー制約を削除する方法
参照関係を解除するには、子テーブル側の外部キー制約を削除します。
|
1 2 |
ALTER TABLE 子テーブル名 DROP CONSTRAINT 外部キー制約名; |
例
|
1 2 |
ALTER TABLE EMP_DETAIL DROP CONSTRAINT FK_EMP_DETAIL_EMP; |
この操作をすべての該当外部キー制約に対して実行します。
外部キー制約を一時的に無効化する方法
削除せずに一時的に解除したい場合は、無効化します。
|
1 2 |
ALTER TABLE 子テーブル名 DISABLE CONSTRAINT 外部キー制約名; |
再度有効化する場合
|
1 2 |
ALTER TABLE 子テーブル名 ENABLE CONSTRAINT 外部キー制約名; |
データ整合性を維持したい場合は、削除ではなく無効化を選択するのが安全です。
主キー・一意キーを削除する手順
外部キー制約を削除または無効化した後、親テーブル側の制約を削除します。
|
1 2 |
ALTER TABLE 親テーブル名 DROP CONSTRAINT 主キー制約名; |
または
|
1 2 |
ALTER TABLE 親テーブル名 DROP CONSTRAINT 一意キー制約名; |
この順番を守らないと、再びORA-02449が発生します。
DROP TABLE時に発生する場合の対処
テーブルごと削除する場合は、CASCADE CONSTRAINTSを使用します。
|
1 |
DROP TABLE 親テーブル名 CASCADE CONSTRAINTS; |
この構文は、参照している外部キー制約も同時に削除します。
よくあるミス
| ミス内容 | 問題点 |
|---|---|
| インデックスを削除しているつもり | 実体は制約 |
| 子テーブルを確認せず削除 | ORA-02449が再発 |
| 制約名を誤指定 | 想定外の制約を削除 |
制約名は必ずデータディクショナリで確認してください。
よくある質問(Q & A)
- 外部キー制約を削除しても問題ありませんか?
-
業務上参照整合性が不要であれば削除可能ですが、通常は無効化または再作成を前提としてください。
- r_constraint_name とは何ですか?
-
外部キー制約が参照している親側の制約名です。
- ALL_CONSTRAINTSを使う必要はありますか?
-
他スキーマの表を確認する場合は USER_CONSTRAINTS ではなく ALL_CONSTRAINTS を使用します。
まとめ
ORA-02449は、主キーまたは一意キーが外部キー制約から参照されている状態で削除しようとした場合に発生します。
対処の基本は次の流れです。
- 親制約名を確認する
- 参照している子テーブルと外部キー制約を特定する
- 外部キー制約を削除または無効化する
- 親側の制約を削除する
順番を守れば、安全にエラーを解消できます。
