【问题标题】:Get table name by foreign key通过外键获取表名
【发布时间】:2015-03-06 10:08:52
【问题描述】:

我在数据库中有两个表。第一个表有第二个表的外键。

我可以通过第一个表的外键获取第二个表名吗?

【问题讨论】:

标签: postgresql foreign-keys


【解决方案1】:

是的,你可以。

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 名称来评估您的 fk_name。或者如果愿意,可以使用 oid。
这适用于 9.3,但我认为也适用于 9.x。

【讨论】:

    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2012-12-27
      • 2021-05-20
      相关资源
      最近更新 更多