使用表、字段和模式名称查找引用的表名称
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_Id
、TableB
和Schema2
传递给函数并得到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_constraint
和pg_attribute
的详细信息。还有更多关于object identifier types 的信息。
相关:
PostgreSQL drop constraint with unknown name Retrieving all PK and FK【讨论】:
以上是关于使用表、字段和模式名称查找引用的表名称的主要内容,如果未能解决你的问题,请参考以下文章