HOWTO · PostgreSQL

存在する場合は削除する vs PostgreSQL で削除する

別の外部キー参照がある場合、DROP ステートメントでエラーが表示されることがあります。 テーブルが存在しない場合は、ドロップ中にエラーも表示されます。

DROP ステートメントは、データベースからテーブルを削除します。 ただし、削除しようとしているテーブルが存在しない場合、DROP ステートメントだけがエラーを表示します。

DROP IF EXISTS を使用すると、エラーを解消できます。

PostgreSQL のDROPDROP IF EXISTS

データベースに存在しないテーブルを削除してみましょう。

例:

postgres=# drop table account;
ERROR:  table "account" does not exist
postgres=#

postgres=# drop table if exists account;
NOTICE:  table "account" does not exist, skipping
DROP TABLE
postgres=#

drop を使用すると、テーブルが存在しないというエラーが表示されます。 ただし、drop table if exists を使用すると、テーブルが存在しないという通知が表示されます。 エラーは発生していません。

他のテーブルが依存しているテーブルを削除する

販売用と顧客レコード用の 2つのテーブルがあるとします。 Sales テーブルは顧客とその購入を記録するため、Customer テーブルの削除は CASCADE オプションで行う必要があります。

最初に 2つのテーブルを作成しましょう。

CREATE TABLE Customer(
    id INT PRIMARY KEY,
    full_name VARCHAR,
    branch VARCHAR
);

CREATE TABLE Sales(
    id INT PRIMARY KEY,
    item_name VARCHAR,
    price DECIMAL,
    customer_id int,
    FOREIGN KEY (customer_id) REFERENCES Customer(id)
);

それでは、Customer テーブルを削除してみましょう。

postgres=# drop table customer;
ERROR:  cannot drop table customer because other objects depend on it
DETAIL:  constraint sales_customer_id_fkey on table sales depends on table customer
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
postgres=#

説明したように、SalesCustomer テーブルに依存しており、このエラーが表示されます。

DROP ステートメントで CASCADE オプションを試してください。 方法は次のとおりです。

postgres=# DROP TABLE IF EXISTS Customer CASCADE;
NOTICE:  drop cascades to constraint sales_customer_id_fkey on table sales
DROP TABLE
postgres=#

これで、テーブル Customer が削除されました。

ここでは、Customer テーブルが存在するかどうかを確認しています。 存在する場合は、CASCADE で削除します。

テーブルの削除について詳しくは、次の公式 ドキュメント を参照してください。