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

PostgreSQL:约束名称不一定是唯一的,postgresql,Postgresql,我试图列出模式中的所有外键,并为每个键列出所涉及的列。 因此,我正在查询pg_catalog.pg_约束和information_schema.columns表 我需要一种方法来区分键,进行第二次查询并检索键列列表 我本想使用约束名称(在pg_catalog.pg_constraint表中的conname列),但约束名称不一定是唯一的!为什么?我在文档中找不到关于这个事实的更多信息 这对夫妇是独一无二的吗 以下是我的疑问: 检索给定架构中的外键列表: 选择 conname作为约束名称, conr

我试图列出模式中的所有外键,并为每个键列出所涉及的列。 因此,我正在查询
pg_catalog.pg_约束
information_schema.columns

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

我本想使用约束名称(在
pg_catalog.pg_constraint
表中的
conname
列),但约束名称不一定是唯一的!为什么?我在文档中找不到关于这个事实的更多信息

这对夫妇是独一无二的吗

以下是我的疑问:

检索给定架构中的外键列表:

选择
conname作为约束名称,
conrelid::regclass作为引用_表,
ConfreId::regclass作为引用的\u表
从pg_catalog.pg_约束
其中contype='f'和((conrelid::regclass | | | LIKE'.%')或(conrelid::regclass | | LIKE'.%'))
检索给定键的列列表:

选择
c、 列名称作为键列
从信息_schema.c列
JOIN pg_catalog.pg_约束r ON(c.table_schema | |'.| | c.table_name)=(r.conrelid::regclass | |')
其中r.conname=“”

感谢您的帮助。

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

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

逻辑键似乎是(schemaname,constraint\u name):这些名称在架构中应该是唯一的。这不会反映在pg_catalog.pg_约束中,它在(conname,connamespace)上只有一个非唯一索引。IMHO不需要通过此级别的约束强制唯一性。
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>'