0

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
       }

ここで、複数の列が同じ列の同じテーブル Table2 を参照している Table1 を見つける必要があります。そして、膨大な数のテーブルを手動で見つけることはできません。

これに利用できるSQLはありますか?何か案は?前もって感謝します。

4

2 に答える 2

1

pg_constraintの表を使用して、pg_catalog制約を見つけることができます。(ドキュメンテーション)

外部キーとそれらが参照するテーブルのリストを取得するには、次のようにします。

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'    
;

そこから、関心のあるケースを特定するためにフィルタリングできます。

于 2013-09-12T07:08:15.547 に答える
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

于 2013-09-12T07:29:43.533 に答える