3

PostgreSQL を使用して、特定のエントリに依存するエントリを確認するにはどうすればよいですか? (「エントリを参照する外部キーを持つ」ことを意味する従属)。

基本的に、テーブルの特定のエントリを取得するときに、どのエントリがカスケードされるかを確認したいと考えていDELETEます。

4

3 に答える 3

3

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.
于 2012-10-05T15:29:19.913 に答える
2

これは問題ありません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);

見る:

于 2012-10-06T01:46:36.933 に答える
2

これは、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_depend
  • 外部キーについて学習するためのpg_constraint
  • テーブルについて学ぶためのpg_class

これを拡張して関連する列を示すことは、読者の課題として残されています。(ヒント: pg_attribute。)

于 2012-10-05T15:56:31.813 に答える