【问题标题】:How to find tables where more than one column references the same table in postgresql如何在postgresql中查找多个列引用同一个表的表
【发布时间】:2013-09-12 15:29:43
【问题描述】:

我有一个包含 600 多个表的 postgresql 数据库。

这大概是我的情况:

Table1{
       column1 data_type,
       column2 data_type,

       constraint const_name1 foreign key(column1)
       references Table2(table_id)

       constraint const_name2 foreign key(column2)
       references Table2(table_id)
       }


Table2{
       table_id data_type
       }

现在我需要找到 Table1,其中不止一列在同一列上引用了同一个表 Table2。而且由于表格数量如此之多,手动查找它们是不可能的。

有可用的 sql 吗?有任何想法吗?提前致谢。

【问题讨论】:

  • this 怎么样?这是获取所有外键的方法。那么剩下的事情应该很容易了。

标签: sql database postgresql


【解决方案1】:

类似这样的:

select
    sc.relname, 
    dc.relname as ref_relname,
    c.confkey
from pg_catalog.pg_constraint as c 
    inner join pg_catalog.pg_class as sc on sc.oid = c.conrelid
    inner join pg_catalog.pg_class as dc on dc.oid = c.confrelid
where c.contype = 'f'
group by sc.relname, dc.relname, c.confkey
having count(*) > 1

sql fiddle demo

【讨论】:

    【解决方案2】:

    您可以使用pg_catalog 中的pg_constraint 表来查找约束。 (Documentation)

    要获取外键列表和它们引用的表,您可以这样做:

    SELECT c.conname  AS constraint_name, 
           sc.relname AS source_table, 
           dc.relname AS dest_table
      FROM pg_catalog.pg_constraint c 
           LEFT JOIN pg_catalog.pg_class sc ON c.conrelid = sc.oid
           LEFT JOIN pg_catalog.pg_class dc ON c.conrelid = dc.oid
     WHERE contype = 'f'    
    ;
    

    您可以从那里筛选出您感兴趣的案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多