【PostgreSQL】テーブル削除できない時の対処方法(cannot drop table because other objects depend on it)

PostgreSQL構文

テーブルが削除できない時の対処方法

ここでは、テーブルを削除しようとした時、エラーが発生した場合の対処方法を説明します。

 

 

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.同様エラーにはなりません。