PostgreSQL:约束名称不一定是唯一的

时间:2016-08-02 11:03:06

标签: postgresql

我试图列出架构中的所有外键,并且,对于每个键,列出所涉及的列。 所以我要查询pg_catalog.pg_constraintinformation_schema.columns表格。

我需要一种方法来区分键,进行第二次查询并检索键列列表。

我想在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>'

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

约束名称仅在定义它们的对象中是唯一的。

两个不同的表(或域)可以具有相同名称的约束。