2016-08-02 6 views
0

私はスキーマ内のすべての外部キーを一覧表示しようとしています。 pg_catalog.pg_constraintinformation_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>' 

ありがとうございました。

+0

論理キーは(schemaname、constraint_name)のようです:名前はスキーマ内で一意であると考えられます。これはpg_catalog.pg_constraintに反映されません。(conname、connamespace)には一意でないインデックスしかありません。 IMHOこのレベルの制約によって一意性を強制する必要はありません。 – joop

答えて

0

制約名は、定義されているオブジェクト内でのみ一意です。

2つの異なるテーブル(またはドメイン)に同じ名前の制約を付けることができます。

関連する問題