主キーと外部キーをリストするための大量のクエリを見てきましたが、どのようにテーブルをクエリできますかmissing主キー?
主キーなしですべてのテーブルをリストするには、これを使用できます:
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
をクエリすることで、どちらも取得できます。
主キーなしですべてのテーブルを取得するもう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があると想定されているかわかりません。だからそれは手作業です、あなたはすべてのテーブルを調べて、自分でそのようなテーブルを見つける必要があります。
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'