PostgreSQLでデータベースを管理していると、「現在のデータベースにどんなテーブルがあるか」を確認したい場面は非常に多いでしょう。
PostgreSQLにはテーブル一覧を取得するための複数の方法が用意されており、psqlのメタコマンド・information_schema・pg_tablesなどを使い分けることで必要な情報を効率的に取得できます。
本記事では、PostgreSQLのテーブル一覧を表示するSQLと実行手順を詳しく解説するとともに、information_schema・pg_tablesの違い・フィルタリング方法・実用的なメタデータ参照のクエリについても説明します。
PostgreSQL初学者から運用担当者まで役立つ内容ですのでぜひ参考にしてみてください。
PostgreSQLのテーブル一覧表示は\dtかpg_tablesで取得(結論)
それではまず、PostgreSQLでテーブル一覧を取得する最も一般的な方法について解説していきます。
PostgreSQLでテーブル一覧を表示するには、psqlのメタコマンド\dtまたはSQLクエリでpg_tablesやinformation_schema.tablesを参照する方法があります。
— 方法1:psqlメタコマンド(最も手軽)
\dt
— 特定スキーマのテーブル一覧
\dt public.*
— 全スキーマのテーブル一覧
\dt *.*
— 方法2:pg_tablesを使ったSQL
SELECT schemaname, tablename, tableowner
FROM pg_tables
WHERE schemaname = ‘public’
ORDER BY tablename;
— 方法3:information_schema.tablesを使ったSQL
SELECT table_schema, table_name, table_type
FROM information_schema.tables
WHERE table_schema = ‘public’
AND table_type = ‘BASE TABLE’
ORDER BY table_name;
\dtはpsql内でのみ使えるメタコマンドです。アプリケーションやGUIツールからSQLとして実行したい場合はpg_tablesまたはinformation_schema.tablesを使うSQLクエリを使います。どちらもほぼ同じ結果を返しますが、pg_tablesはPostgreSQL独自でテーブルの物理的な情報も取得でき、information_schemaはSQL標準に準拠しています。
\dtコマンドの使い方詳細
\dtコマンドの基本的な使い方を整理します。
| コマンド | 表示内容 |
|---|---|
| \dt | 現在のスキーマのテーブル一覧 |
| \dt public.* | publicスキーマのテーブル一覧 |
| \dt *.* | 全スキーマのテーブル一覧 |
| \dt user* | 名前がuserで始まるテーブルの一覧 |
| \dt+ | テーブル一覧+サイズ・コメントなど詳細情報 |
\dtに続いてパターン文字列を指定するとワイルドカード(*・?)でフィルタリングできます。
大規模なデータベースでテーブルが多い場合に特に便利です。
pg_tablesの主なカラム
pg_tablesで取得できる主なカラムを確認しておきます。
SELECT * FROM pg_tables WHERE schemaname = ‘public’ LIMIT 3;
— 主なカラム
— schemaname:スキーマ名
— tablename:テーブル名
— tableowner:テーブルのオーナー(作成者)
— tablespace:テーブルスペース名(NULLはデフォルト)
— hasindexes:インデックスの有無(boolean)
— hasrules:ルールの有無(boolean)
— hastriggers:トリガーの有無(boolean)
information_schemaを使ったテーブル一覧取得
続いては、information_schemaを使ったテーブル一覧の取得方法を確認していきます。
information_schemaはSQL標準に準拠したメタデータビューのセットで、PostgreSQL以外のRDBMSでも同様のクエリが使えます。
information_schema.tablesの基本クエリ
SELECT
table_catalog, – データベース名
table_schema, — スキーマ名
table_name, — テーブル名
table_type – テーブルの種類(BASE TABLE / VIEW)
FROM information_schema.tables
WHERE table_schema NOT IN (‘information_schema’, ‘pg_catalog’)
AND table_type = ‘BASE TABLE’
ORDER BY table_schema, table_name;
table_schema NOT IN (‘information_schema’, ‘pg_catalog’)とすることで、システムテーブルを除外してユーザーが作成したテーブルだけを表示できます。
table_type = ‘BASE TABLE’でビュー(VIEW)を除外し、通常のテーブルだけを絞り込めます。
ビューも含めた一覧取得
テーブルとビューの両方を確認したい場合はtable_typeの条件を外します。
SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = ‘public’
ORDER BY table_type, table_name;
— table_typeの値
— BASE TABLE:通常のテーブル
— VIEW:ビュー
— FOREIGN:外部テーブル(FDW)
— LOCAL TEMPORARY:一時テーブル
テーブル数のカウント
データベース内のテーブル数を確認する際は以下のクエリが便利です。
SELECT COUNT(*) AS table_count
FROM information_schema.tables
WHERE table_schema = ‘public’
AND table_type = ‘BASE TABLE’;
— スキーマ別のテーブル数
SELECT table_schema, COUNT(*) AS table_count
FROM information_schema.tables
WHERE table_type = ‘BASE TABLE’
AND table_schema NOT IN (‘information_schema’, ‘pg_catalog’)
GROUP BY table_schema
ORDER BY table_count DESC;
テーブル一覧の実用的な応用クエリ
続いては、テーブル一覧取得に関連した実用的な応用クエリを確認していきます。
テーブルとカラム情報を合わせて取得
テーブル一覧とカラム情報を結合して一度に取得することで、データベース全体の構造把握が効率的に行えます。
SELECT
t.table_name,
c.column_name,
c.data_type,
c.is_nullable
FROM information_schema.tables t
JOIN information_schema.columns c
ON t.table_name = c.table_name
AND t.table_schema = c.table_schema
WHERE t.table_schema = ‘public’
AND t.table_type = ‘BASE TABLE’
ORDER BY t.table_name, c.ordinal_position;
このクエリはデータベース設計書の作成や、新規参画メンバーへのデータベース構造説明に非常に役立ちます。
テーブルサイズ付きの一覧取得
テーブル一覧にサイズ情報を加えることで、データ量の多いテーブルを特定できます。
SELECT
relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
n_live_tup AS row_count
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
テーブルサイズ付き一覧はデータベースのディスク使用量管理や、パーティショニング・アーカイブが必要なテーブルの特定に非常に有用です。
最終更新日時でのテーブルフィルタリング
PostgreSQLのpg_stat_user_tablesを使うとテーブルへのアクセス統計情報も取得できます。
SELECT
relname AS table_name,
last_vacuum, – 最後のVACUUM実行日時
last_analyze, — 最後のANALYZE実行日時
n_live_tup AS live_rows,
n_dead_tup AS dead_rows
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
dead_rowsが多いテーブルはVACUUMが必要な状態であり、定期的にこのクエリで確認することがデータベースの健全性維持に役立ちます。
データベース管理における活用シーン
続いては、テーブル一覧取得をデータベース管理でどのように活用するかを確認していきます。
データベース移行・複製時の活用
データベースを別の環境に移行する際、まずテーブル一覧を取得して移行対象を確認することが重要です。
以下のクエリでCREATE TABLE文の形式でテーブル一覧を確認できます。
— テーブルのDDLをpg_dump相当で確認
SELECT ‘DROP TABLE IF EXISTS ‘ || tablename || ‘;’ AS drop_sql
FROM pg_tables
WHERE schemaname = ‘public’
ORDER BY tablename;
このクエリで生成したDROP TABLE文のリストは、テスト環境のリセットスクリプト作成にも活用できます。
テーブル命名規則のチェック
大規模なデータベースではテーブルの命名規則が守られているかを確認したい場面があります。
— テーブル名がスネークケースかどうかを確認
SELECT tablename
FROM pg_tables
WHERE schemaname = ‘public’
AND tablename ~ ‘[A-Z]’ — 大文字を含むテーブル名を検出
ORDER BY tablename;
このクエリで命名規則違反のテーブルを簡単に特定できます。
定期的なメタデータの確認と管理はデータベースの品質維持において非常に重要な習慣です。
権限情報と組み合わせた管理
テーブル一覧とアクセス権限情報を組み合わせることで、セキュリティ観点でのデータベース管理も行えます。
SELECT
grantee, – 権限付与先のユーザー・ロール
table_name,
privilege_type – 権限の種類(SELECT・INSERT等)
FROM information_schema.role_table_grants
WHERE table_schema = ‘public’
ORDER BY table_name, grantee;
このクエリでどのユーザー・ロールがどのテーブルにどのような権限を持っているかを確認でき、不要な権限の洗い出しにも役立ちます。
まとめ
PostgreSQLのテーブル一覧を表示する方法は主に3種類あります。
psqlのメタコマンド\dtは最も手軽で、ワイルドカードによるフィルタリングも可能です。
pg_tablesを使ったSQLはPostgreSQL固有の情報(オーナー・インデックス有無など)も取得でき、information_schema.tablesはSQL標準に準拠しており他のRDBMSとの互換性があります。
テーブルサイズ・統計情報・権限情報と組み合わせることで、データベース管理の幅が大きく広がります。
本記事で紹介したクエリを参考に、PostgreSQLのデータベース管理を効率化してみてください。