2016-08-02 68 views
0

我試圖列出模式中的所有外鍵,並且對於每個鍵列出涉及的列。 所以我在查詢pg_catalog.pg_constraintinformation_schema.columns表。PostgreSQL:約束名稱不一定是唯一的

我需要一種方法來區分鍵,做第二個查詢和檢索關鍵列列表。

我以爲使用約束名稱(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)上只有一個非唯一索引。恕我直言,沒有必要強制通過這一級別的限制來實現唯一性。 – joop

回答

0

約束名稱僅在它們被定義的對象內是唯一的。

兩個不同的表(或域)可以具有相同名稱的約束。