【发布时间】:2019-09-04 18:28:15
【问题描述】:
我正在尝试列出架构中的所有外键,并针对每个键列出所涉及的列。
所以我正在查询pg_catalog.pg_constraint 和information_schema.columns 表。
我需要一种方法来区分键,进行第二次查询并检索键列列表。
我想使用约束名(pg_catalog.pg_constraint 表中的conname 列),但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) 上有一个非唯一索引。恕我直言,无需通过此级别的约束来强制执行唯一性。
标签: postgresql