PostgreSQL を使用して、特定のエントリに依存するエントリを確認するにはどうすればよいですか? (「エントリを参照する外部キーを持つ」ことを意味する従属)。
基本的に、テーブルの特定のエントリを取得するときに、どのエントリがカスケードされるかを確認したいと考えていDELETE
ます。
PostgreSQL を使用して、特定のエントリに依存するエントリを確認するにはどうすればよいですか? (「エントリを参照する外部キーを持つ」ことを意味する従属)。
基本的に、テーブルの特定のエントリを取得するときに、どのエントリがカスケードされるかを確認したいと考えていDELETE
ます。
fk 制約に依存するすべての実際の行を表示するには、以下で説明するツールを使用して列を識別します。
外部キー制約が で定義されている場合、依存する行が削除されます (より依存するテーブルにON DELETE CASCADE
カスケードする可能性があります)。DELETE
外部キー制約がON DELETE SET NULL
/で定義されている場合、列の値のみが/ デフォルト値ON DELETE SET DEFAULT
にリセットされます。NULL
それ以外のDELETE
場合、依存する行を持つ行は例外で失敗します。
次に、識別されたテーブル/列に対して次のようなクエリを実行します。
SELECT f.tbl_fk_id, f.col_fk
FROM tbl_fk f
JOIN tbl t ON f.col_fk = t.col
AND <same condition as DELETE here>;
pgAdminは次の機能を提供します。
左のオブジェクト ブラウザでオブジェクトを選択し、右上の依存ペインを選択します。
pgAdmin は、システム カタログに対していくつかのクエリを使用してリストを作成します。自分でクエリを作成する場合は、発行されたコマンドをログに記録できます。
また、依存オブジェクトについて完全に確信が持てないオブジェクトを削除する場合は、DROP
最初にプレーン (なしCASCADE
) を試してください。依存関係が存在する場合、エラー メッセージが表示されます ...
最後に、注意して進めてください。、トランザクションを開始して、コマンドを発行するだけです。
BEGIN;
DROP TABLE tbl CASCADE;
次に、あなたが見たものが好きなら:
COMMIT;
そうでない場合:
ROLLBACK;
そして、それは決して起こらなかったようになります。;)
次のようなものが表示されます。
NOTICE: drop cascades to 4 other objects
DETAIL: drop cascades to constraint tbl1_tbl_id_fkey on table myschema.tbl1
drop cascades to constraint tbl_winner_tbl_id_fkey on table myschema.tbl_foo
drop cascades to constraint bar_tbl_id_fkey on table myschema.bar
drop cascades to constraint tbl1_tbl_id_fkey on table x.tbl1
Query returned successfully with no result in 47 ms.
これは問題ありませんpg_catalog
が、PostgreSQL のメジャー バージョン間で非互換に変更される可能性があります。可能な限り、information_schema
代わりに を使用してください。
SELECT *
FROM information_schema.constraint_column_usage ccu
INNER JOIN information_schema.referential_constraints rc
USING (constraint_catalog, constraint_schema, constraint_name);
見る:
これは、PostgreSQL システム カタログから直接クエリできます。
SELECT
depending.relname as depending_table,
referenced.relname as referenced_table
FROM pg_catalog.pg_depend d
JOIN pg_catalog.pg_constraint fkey ON fkey.oid=d.objid AND fkey.contype='f'
JOIN pg_catalog.pg_class depending ON depending.oid=fkey.conrelid
JOIN pg_catalog.pg_class referenced ON referenced.oid=d.refobjid
WHERE fkey.confdeltype='c' -- just cascading deletes
AND referenced.oid != depending.oid -- ignoring reflexive dependencies
AND referenced.relkind='r' -- tables only
この SQL Fiddleと関連ドキュメントを参照してください。
これを拡張して関連する列を示すことは、読者の課題として残されています。(ヒント: pg_attribute。)