1

我有一个要求,我需要使用此字段名、表名(此字段所在的位置)和架构名称(其中表,因此该字段驻留)

例如:

Schema1.TableA
  Id (Integer, PK)  
  Name varchar


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

我需要将A_Id,TableB和传递Schema2给一个函数并得到Schema1.TableA结果。

我正在使用 Postgres 8.3。

4

1 回答 1

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的详细信息。还有更多关于对象标识符类型的信息。

有关的:

于 2013-03-25T21:22:47.580 回答