0
私はスキーマ内のすべての外部キーを一覧表示しようとしています。 pg_catalog.pg_constraint
とinformation_schema.columns
テーブルを照会しています。PostgreSQL:制約名は必ずしも一意ではありません
キーを区別し、2番目のクエリを実行してキー列リストを取得する方法が必要です。
私は制約名(conname
カラム、pg_catalog.pg_constraint
テーブル)を使用すると考えましたが、PostgreSQL documentation about pg_constraintは、制約名が必ずしも一意ではないと言います!どうして?私はこの事実に関する追加情報を文書で見つけることができません。
カップルconnamespace
+ conname
は一意ですか?
これは私のクエリです:
は、与えられたスキーマからとする外部キーのリストを取得します。
SELECT
conname AS constraint_name,
conrelid::regclass AS referring_table,
confrelid::regclass AS referenced_table
FROM pg_catalog.pg_constraint
WHERE contype = 'f' AND ((conrelid::regclass || '' LIKE '<my_schema_name>.%') OR (confrelid::regclass || '' LIKE '<my_schema_name>.%'))
は、指定されたキーの列のリストを取得します。
SELECT
c.column_name AS key_column
FROM information_schema.columns c
JOIN pg_catalog.pg_constraint r ON (c.table_schema || '.' || c.table_name) = (r.conrelid::regclass || '')
WHERE r.conname = '<my_constraint_name>'
ありがとうございました。
論理キーは(schemaname、constraint_name)のようです:名前はスキーマ内で一意であると考えられます。これはpg_catalog.pg_constraintに反映されません。(conname、connamespace)には一意でないインデックスしかありません。 IMHOこのレベルの制約によって一意性を強制する必要はありません。 – joop