0
我試圖列出模式中的所有外鍵,並且對於每個鍵列出涉及的列。 所以我在查詢pg_catalog.pg_constraint
和information_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>'
感謝您的幫助。
邏輯關鍵似乎是(schemaname,constraint_name):名稱在模式中應該是唯一的。這並不反映在pg_catalog.pg_constraint中,它在(conname,connamespace)上只有一個非唯一索引。恕我直言,沒有必要強制通過這一級別的限制來實現唯一性。 – joop