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

Posted

技术标签:

【中文标题】使用表、字段和模式名称查找引用的表名称【英文标题】:Find the referenced table name using table, field and schema name 【发布时间】:2013-03-15 03:23:19 【问题描述】:

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

例如:

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。

【问题讨论】:

我认为你需要query the information_schema.key_column_usage table。该架构不在您的路径中,因此请从 select * from information_schema.key_column_usage; 之类的内容开始。 【参考方案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 的详细信息。还有更多关于object identifier types 的信息。

相关:

PostgreSQL drop constraint with unknown name Retrieving all PK and FK

【讨论】:

以上是关于使用表、字段和模式名称查找引用的表名称的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2000中查询表名,列名及字段类型

实体框架数据库首先是多个模式重复的表名

如何根据列名查找表名,然后访问该表

SQL 查询某字段数据所在的表

使用动态生成的表名选择

工作表范围内已定义名称的表名是啥?