使用表,字段和模式名称查找引用的表名

时间:2013-03-25 15:11:00

标签: sql postgresql foreign-keys constraints

我有一个要求,我需要使用此字段名称,表名(此字段所在的位置)和模式,通过表(外键表)中的特定字段查找引用的表名(主键表名)名称(表格和字段所在的位置)

例如:

Schema1.TableA
  Id (Integer, PK)  
  Name varchar


Schema2.TableB
  Id (integer, PK)  
  A_Id (integer, FK referencing TableA.Id)  
  Name varchar  

我需要将A_IdTableBSchema2传递给某个函数并获取Schema1.TableA作为结果。

我正在使用Postgres 8.3。

1 个答案:

答案 0 :(得分:1)

如果您不需要将其移植到另一个RDBMS,那么使用pg_catalog中的目录表而不是标准信息模式, 更快更简单:< / p>

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 = '"Schema2"."TableB"'::regclass   -- table name
AND    a.attname  = 'A_Id'                           -- column name  
AND    c.contype  = 'f'
ORDER  BY conrelid::regclass::text, contype DESC;

返回:

 referenced_table | fk_name  |  fk_definition
------------------+-------------------------+----------------------------------------------
 Schema1.TableA   | b1_fkey  | FOREIGN KEY ("B_id") REFERENCES "Schema1"."TableA"("A_id")

注释

  • 另外两列仅用于定向。根据你的Q,你只需要第一列。

  • 这将返回所有涉及给定列名的外键的所有引用的表 - 包括多列上的FK约束。

  • 根据当前search_path设置的可见性,名称会自动符合架构标准。该名称也会在需要时自动转义(非法或大写字母,保留字......)。

查看手册中pg_constraintpg_attribute的详细信息。还有更多关于object identifier types的内容。

相关: