【PostgreSQL】テーブル削除できない時の対処方法(cannot drop table because other objects depend on it)
テーブルが削除できない時の対処方法
ここでは、テーブルを削除しようとした時、エラーが発生した場合の対処方法を説明します。
1.外部キー制約がある時
外部キーで他のテーブルから参照されているテーブルを削除すると、
『constraint 外部キー名 on table テーブル名1 depends on table テーブル名2』
というエラーメッセージが表示されます。
このメッセージは、『他のオブジェクトが依存しているため、テーブル名2を削除できません。』
という意味です。この場合、本来テーブル名2を削除したいのに、
テーブル名1から参照がかかっているため削除できないことを示しています。
このエラーの対処方法は次の3つです。
※すべてを行うのではなくどれか一つで大丈夫です。
対処方法1
参照しているテーブル(上のメッセージではテーブル名1)を先に消す
--参照元のテーブルを先に消した後、本来削除したいテーブルを消す
DROP TABLE 参照元のテーブル名; -- 参照元のテーブルの削除
DROP TABLE 本来消したいテーブル名; -- 削除したいテーブルの削除
対処方法2
参照しているテーブル(上のメッセージではテーブル名1)の外部キー制約を消す
--参照元のテーブルから外部キー制約を削除した後、本来消したいテーブルを消す
ALTER TABLE 参照元テーブル名 DROP CONSTRAINT 外部キー名; --外部キー削除
DROP TABLE 本来消したいテーブル名; -- 削除したいテーブルの削除
対処方法3
DROP ・・・ CASCADE文を使用する
--削除したいテーブル名の後ろに「CASCADE」をつける
DROP TABLE 本来消したいテーブル名 CASCADE; -- 削除したいテーブルの削除
※ CASCADEをつけた場合、関わる制約・参照を削除します。この場合は外部キーを自動で削除します。
2.削除するテーブルがVIEWで使われている時
VIEWで使用されているテーブルを削除すると、
『view ビュー名 depends on table テーブル名1』
というエラーメッセージが表示されます。
このメッセージは、『ビュー名はテーブル名1に依存しています。』という意味です。
対処方法1
削除したいテーブルを使っているビューを先に消す
--削除したいテーブルを使っているビューを先に消す
DROP VIEW ビュー名; -- ビューの削除
DROP TABLE 本来消したいテーブル名; -- 削除したいテーブルの削除
対処方法2
DROP ・・・ CASCADE文を使用する
--削除したいテーブル名の後ろに「CASCADE」をつける
DROP TABLE 本来消したいテーブル名 CASCADE; -- 削除したいテーブルの削除
※ CASCADEをつけた場合、関わる制約・参照を削除します。この場合はビューを自動で削除します。
余談:エラーにならないケース
次の場合は、テーブル削除してもエラーとならないケースです。
※ すべての場合を検証していませんので、一例ととらえて下さい。
1)削除したテーブルが関数から参照されていた時
関数で使用されているテーブルを削除してもエラーにはなりませんでした。
当然ですが、関数実行時にテーブルが存在しないエラーが発生します。
2)削除したテーブルがトリガーから参照されていた時
関数同様にエラーになりません。
また、トリガーで呼ばれる関数から参照されていても1.同様エラーにはなりません。