1

我有一个表用户,org_id其中有一个字段,称为表的外键organisation,主键字段organisation_id。知道表名(用户)和字段名(users.org_id),有没有可以告诉我引用的名称和字段的查询org_id

我发现了一个与此类似的Stackoverflow 帖子,其中提供了一个查询来确定引用的表名,但我还需要知道所引用的字段名称:

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

4

1 回答 1

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()

于 2013-08-22T16:03:47.283 回答