我在数据库中有两个表。第一个表有第二个表的外键。
我可以通过第一张表中的外键获取第二个表名吗?
答案 0 :(得分:2)
是的,你可以。
SELECT ct.oid, conname, condeferrable, condeferred, confupdtype, confdeltype, confmatchtype, conkey, confkey, confrelid, nl.nspname as fknsp, cl.relname as fktab, nr.nspname as refnsp, cr.relname as reftab, description, convalidated
FROM pg_constraint ct
JOIN pg_class cl ON cl.oid=conrelid
JOIN pg_namespace nl ON nl.oid=cl.relnamespace
JOIN pg_class cr ON cr.oid=confrelid
JOIN pg_namespace nr ON nr.oid=cr.relnamespace
LEFT OUTER JOIN pg_description des ON (des.objoid=ct.oid AND des.classoid='pg_constraint'::regclass)
WHERE contype='f' AND ct.conname = 'yourfk_name' -- conrelid = 26941::oid
ORDER BY conname;
使用foreign_key名称定义yourfk_name。或者如果喜欢的话使用oid。
这适用于9.3,但我认为也是9.x。
答案 1 :(得分:2)
通过转换为regclass
更简单,更快捷:
SELECT conrelid::regclass::text AS tbl
, conname AS fk_constraint
, confrelid::regclass::text AS referenced_tbl
FROM pg_constraint
WHERE contype = 'f'
AND conrelid = 'first_table_name'::regclass -- table name
-- AND conname = 'fk_name' -- optionally restrict to given FK
ORDER BY conname;
表名不一定是唯一的。架构限定表名或依赖search_path
。
适用于任何版本的Postgres千禧年这一方。