我需要从数据库获取约束列表,并将它们与它们相关的列相匹配。对于此任务,我将使用 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检索列名?
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)