我有一个要求,我需要使用此字段名称,表名(此字段所在的位置)和模式,通过表(外键表)中的特定字段查找引用的表名(主键表名)名称(表格和字段所在的位置)
例如:
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。
答案 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_constraint
和pg_attribute
的详细信息。还有更多关于object identifier types的内容。
相关: