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

2020年12月30日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.同様エラーにはなりません。

 

構文まとめを書いています。ぜひ一度見てみて下さい

「基本構文・こんな時どう書くんだっけ?」をまとめました