web-dev-qa-db-ja.com

主キーなしですべてのテーブルをリストするにはどうすればよいですか?

主キーと外部キーをリストするための大量のクエリを見てきましたが、どのようにテーブルをクエリできますかmissing主キー?

5
Phill Pafford

主キーなしですべてのテーブルをリストするには、これを使用できます:

select tbl.table_schema, 
       tbl.table_name
from information_schema.tables tbl
where table_type = 'BASE TABLE'
  and table_schema not in ('pg_catalog', 'information_schema')
  and not exists (select 1 
                  from information_schema.key_column_usage kcu
                  where kcu.table_name = tbl.table_name 
                    and kcu.table_schema = tbl.table_schema)

他のテーブルを参照していないテーブルや、他のテーブルによって参照されていないテーブルを検索するかどうかは、私にはわかりません。ただし、上記のクエリと同様の方法でinformation_schema.referential_constraintsをクエリすることで、どちらも取得できます。

10

主キーなしですべてのテーブルを取得するもう1つのクエリ:

SELECT table_schema || '.' || table_name
FROM information_schema.tables
WHERE
    (table_catalog, table_schema, table_name) NOT IN (
        SELECT table_catalog, table_schema, table_name
        FROM information_schema.table_constraints
        WHERE constraint_type = 'PRIMARY KEY') AND
    table_schema NOT IN ('information_schema', 'pg_catalog', 'pgq', 'londiste');

残念ながらPostgreSQLは、どのテーブルにFKがあると想定されているかわかりません。だからそれは手作業です、あなたはすべてのテーブルを調べて、自分でそのようなテーブルを見つける必要があります。

1
grayhemp

FKのクエリは次のとおりです。

SELECT table_name
FROM information_schema.tables
WHERE table_name NOT IN (
   SELECT distinct table_name
        FROM information_schema.table_constraints
        WHERE constraint_type = 'FOREIGN KEY' and table_schema ='xxxxx') AND
    table_schema ='xxxxx'
0
Latha Kandasamy