我有一个表名为org_id
的字段的用户,它是表organisation
的外键,主键字段为organisation_id
。知道表名(用户)和字段名称(users.org_id
),是否有一个查询可以告诉我org_id
引用的名称和字段?
我发现了一个与此类似的Stackoverflow post,其中提供了一个查询来确定引用的表名,但我还需要知道引用的字段名称:
SELECT c.confrelid::regclass::text AS referenced_table
,c.conname AS fk_name
,pg_get_constraintdef(c.oid) AS fk_definition
FROM pg_attribute a
JOIN pg_constraint c ON (c.conrelid, c.conkey[1]) = (a.attrelid, a.attnum)
WHERE a.attrelid = '"Schema"."Users"'::regclass -- table name
AND a.attname = 'org_id' -- column name
AND c.contype = 'f'
ORDER BY conrelid::regclass::text, contype DESC;
因此上面的查询将返回表名(organisation
),fk名称和fk定义。有没有办法获得引用的字段的名称?我知道我可能会执行另一个查询以确定给定表的pk的名称,但我想避免为此执行多个查询。
答案 0 :(得分:2)
此查询添加外键约束的引用列:
SELECT c.confrelid::regclass::text AS referenced_table
,string_agg(f.attname, ', ') AS referenced_columns
,c.conname AS fk_name
,pg_get_constraintdef(c.oid) AS fk_definition
FROM pg_attribute a
JOIN pg_constraint c ON (c.conrelid, c.conkey[1]) = (a.attrelid, a.attnum)
JOIN pg_attribute f ON f.attrelid = c.confrelid
AND f.attnum = ANY (confkey)
WHERE a.attrelid = '"Schema"."Users"'::regclass -- table name
AND a.attname = 'org_id' -- column name
AND c.contype = 'f'
GROUP BY c.confrelid, c.conname, c.oid;
fk约束可以引用多个列。这就是查询中聚合函数string_agg()
的原因。