依存関係の追跡

PostgreSQL 9.0.0文書
前のページ | 巻戻し | 第 5章データ定義 | 早送り | 次のページ

# 5.11. 依存関係の追跡

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

データベース構造全体の整合性を保つため、PostgreSQLは、他のオブジェクトと依存関係にあるオブジェクトの削除を許可しません。 例えば、項5.3.5で作成した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より前のデータベースからのアップグレード中に適切に作成されます。

前のページ | ホーム | 次のページ
その他のデータベースオブジェクト | 上に戻る | データ操作