外部キー制約や、ビュー、トリガ、関数などを使ったテーブルが多数含まれるような複雑なデータベース構造を作成すると、ユーザはそれらのオブジェクト間の暗黙的な依存関係のネットワークも作成していることになります。 例えば、外部キー制約を持つテーブルは、参照するテーブルに依存しています。
データベース構造全体の整合性を保つため、PostgreSQLは、他のオブジェクトと依存関係にあるオブジェクトの削除を許可しません。 例えば、「外部キー」で作成したproductsテーブルを削除しようとしても、ordersテーブルがこのテーブルに依存しているので、以下のようなエラーメッセージが現れます。
DROP TABLE products; NOTICE: constraint orders_product_no_fkey on table orders depends on table products ERROR: cannot drop table products because other objects depend on it HINT: Use DROP ... CASCADE to drop the dependent objects too.
エラーメッセージには役に立つヒントが含まれています。 以下のようにすると、依存する全てのオブジェクトを1つずつ削除する手間を省けます。
DROP TABLE products CASCADE;
これで全ての依存オブジェクトが削除されます。
この場合、ordersテーブルは削除されずに外部キー制約のみが削除されます
(DROP ... CASCADE
が何を行うかを知りたい場合は、CASCADE
を指定せずにDROP
を実行してNOTICE
メッセージを読んでください)。
PostgreSQLでは、全ての削除用コマンドにCASCADE
を指定することができます。
もちろん、どのような依存関係が存在するかは、オブジェクトの種類によって異なります。
また、CASCADE
ではなくRESTRICT
と記述すると、他のオブジェクトが依存しているオブジェクトの削除を禁止するというデフォルトの振舞いを指定することもできます。
標準SQLでは、RESTRICT
またはCASCADE
のいずれかを指定する必要があります。
実際にこの決まり通りのデータベースシステムはありませんが、デフォルトがRESTRICT
であるか、CASCADE
であるかは、システムによって異なります。
PostgreSQLの7.3より前のバージョンにおける外部キー制約の依存関係とシリアル列の依存関係は、アップグレード処理において維持も作成もされません。 その他の種類の依存関係は全て、7.3より前のデータベースからのアップグレード中に適切に作成されます。