如何从 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;
我需要从数据库中获取约束列表并将它们与它们相关的列进行匹配 对于此任务,我将使用 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;