如何从 pg_constraint 获取列名

How to get column name from pg_constraint

我需要从数据库中获取约束列表并将它们与它们相关的列进行匹配 对于此任务,我将使用 pg_constraint。这是我使用的查询

 select conrelid::regclass AS table_from, conname, pg_get_constraintdef(c.oid)
from   pg_constraint c
join   pg_namespace n ON n.oid = c.connamespace
 where conrelid::regclass::text = 'test' order by contype;

如您所见,我对名为 test 的 table 的约束感兴趣 这是输出

table_from |    conname     | pg_get_constraintdef 
------------+----------------+----------------------
 test       | test_age_check | CHECK ((age > 0))

但我想使用上面的查询获取此约束的列名(在本例中,列是 age)。根据docColumn constraints are not treated specially。但也许有一些方法可以用来从 pg_constraint 中检索列名?

pg_constrint.conkey 包含 table 中列序数的数组。您可以使用它们加入 pg_attribute。这里的序号在 attnum.

列中
SELECT c.conrelid::regclass AS table_from,
       c.conname,
       pg_get_constraintdef(c.oid),
       a.attname
       FROM pg_constraint c
            INNER JOIN pg_namespace n
                       ON n.oid = c.connamespace
            CROSS JOIN LATERAL unnest(c.conkey) ak(k)
            INNER JOIN pg_attribute a
                       ON a.attrelid = c.conrelid
                          AND a.attnum = ak.k
       WHERE c.conrelid::regclass::text = 'test'
       ORDER BY c.contype;