無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

5.12. 依存関係の追跡

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

データベース構造全体の整合性を保つため、 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より前のデータベースからのアップグレード中に適切に作成されます。


powered by SEO.CUG.NET