使用表,字段和架构名称查找被引用的表名(Find the referenced table name

2019-07-23 07:08发布

我有我需要在一个表中使用此字段名,表名(其中本场驻留)和架构名称(其中一个特定领域(外键表)来查找引用表名(主键表名)的要求该表并从而领域驻留)

例如:

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。

Answer 1:

如果你不需要这个可以移植到另一个RDBMS它是更快 ,更易于使用的目录表pg_catalog而不是标准的信息模式:

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的说明书中无。 多的关于对象标识符类型为好。

有关:

  • 未知名的PostgreSQL降约束
  • 检索所有PK和FK


文章来源: Find the referenced table name using table, field and schema name