查找外键约束的引用字段

时间:2013-08-22 14:49:28

标签: sql postgresql foreign-keys

我有一个表名为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的名称,但我想避免为此执行多个查询。

1 个答案:

答案 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()的原因。