pg データベースは、主キーなしですべてのテーブルを検索する非常に簡単な方法です。システム テーブルを使用するだけで済みます。

第 1 章 問題解決

step1 データベース内のすべてのテーブルの英語名を調べます。

データベース内のすべてのテーブルの英語名を調べて、「Table A」という名前を付けます。

SELECT * from pg_class where pg_class.reltoastrelid!=0 and pg_class.relname not like 'pg_%' and pg_class.relname not like 'sql_%'

step2 主キーを持つテーブルをすべて検索する

テーブル B という名前の主キーを持つすべてのテーブルを検索します

SELECT pg_class.relname from pg_class where pg_class.relname like '%_pkey'

step3 主キーのないテーブルを探す

方法は、Bテーブルにない要素を取り出し、Aテーブルからサフィックス「_pkey」を削除して完了です。

SELECT A.a1 from (SELECT pg_class.relname a1 from pg_class where pg_class.reltoastrelid!=0 and pg_class.relname not like 'pg_%' and pg_class.relname not like 'sql_%' ) as A
where A.a1 not in  
(SELECT split_part(pg_class.relname,'_pkey',1) as aa from pg_class where pg_class.relname like '%_pkey')

第 2 章 知識の補足

pg_constraint このシステム テーブルには、PostgreSQL のテーブル オブジェクトのチェック制約、主キー、一意制約、および外部キー制約が格納されます。
pg_attribute システムテーブルには、すべてのテーブル (pg_class などのシステムテーブルを含む) のフィールド情報が格納されます。データベース内の各テーブルの各フィールドには、pg_attribute テーブル内の行があります。
pg_type このシステム テーブルには、データ型に関する情報が格納されます。
pg_class このシステム テーブルは、データ テーブル、インデックス (pg_index を参照する必要がある)、シーケンス、ビュー、複合タイプ、およびいくつかの特別な関係タイプのメタデータを記録します。

pg_constraint.conname (制約名)
pg_constraint.conrelid (制約が存在するテーブル、
テーブル制約でない場合は 0) pg_constraint.conkey (テーブル制約の場合、制約によって制御されるフィールドのリスト)
pg_constraint. contypec (チェック制約、f = 外部キー制約、p = 主キー制約、u = 一意制約)
pg_constraint.conkey (テーブル制約 (外部キーを含むが制約トリガーは含まない) の場合、制約付きフィールドのリスト)
pg_attribute.attname (フィールド名)
pg_attribute.attrelid (このフィールドが属するテーブル)
pg_attribute.atttypid (フィールドのデータ型)
pg_attribute.attnum (フィールドの数。通常のフィールドは 1 から数えます。システム フィールド ( oid) (任意の) 負の数値を持ちます)
pg_type.typname (データ型名)
pg_type.oid (行識別子 (隠し属性。明示的に選択する必要があります))
pg_class.relname (データ型名)
pg_class.oid (行識別子 (隠し属性) ; 明示的に選択する必要があります))

おすすめ

転載: blog.csdn.net/quantam/article/details/109308283