如何从 pg_constraint 获取列名

Alm*_*zak 1 postgresql psql

我需要从数据库获取约束列表,并将它们与它们相关的列相匹配。对于此任务,我将使用 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;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我对名为test 的表的约束感兴趣, 这是输出

table_from |    conname     | pg_get_constraintdef 
------------+----------------+----------------------
 test       | test_age_check | CHECK ((age > 0))
Run Code Online (Sandbox Code Playgroud)

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

sti*_*bit 5

pg_constrint.conkey保存表中列序数的数组。您可以使用它们来加入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;
Run Code Online (Sandbox Code Playgroud)