5.10. 依存関係の追跡

外部キー制約や、ビュー、トリガ、関数などを使ったテーブルが多数含まれるような複雑なデータベース構造を作成すると、ユーザはそれらのオブジェクト間の暗黙的な依存関係のネットワークも作成していることになります。 たとえば、外部キー制約を持つテーブルは、参照するテーブルに依存しています。

データベース構造全体の整合性を保つため、PostgreSQLは、他のオブジェクトと依存関係にあるオブジェクトの削除を許可しません。 たとえば、項5.4.5で作成したproductsテーブルを削除しようとしても、ordersテーブルがこのテーブルに依存しているので、以下のようなエラーメッセージが現れます。

DROP TABLE products;

NOTICE:  constraint $1 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より前のバージョンにおける外部キー制約の依存関係とシリアル列の依存関係は、アップグレード処理において維持も作成もされません。 その他すべての依存関係の型は、アップグレード中に適切に作成されます。