PostgreSQLでデータベース開発や運用を行っていると、「このテーブルの構造はどうなっているか?」「どんなカラムと型が定義されているか?」を確認したい場面が頻繁に発生します。
PostgreSQLにはテーブル定義を確認するための複数の方法が用意されており、用途に応じて使い分けることで効率的に情報を取得できます。
本記事では、\dコマンド・information_schema・pg_catalogを使ったテーブル定義の確認方法を詳しく解説します。
フィールド情報・データ型・制約・インデックスなどの構造表示の手順も合わせて説明しますので、PostgreSQL初学者から中級者まで幅広く参考にしていただけます。
PostgreSQLのテーブル定義確認はpsqlの\dコマンドが最も手軽(結論)
それではまず、PostgreSQLでテーブル定義を確認する最も基本的な方法について解説していきます。
PostgreSQLのCLIクライアント「psql」では、\dコマンドを使うことでテーブルの構造(カラム名・データ型・NULL制約・デフォルト値など)を素早く確認できます。
— 基本的な使い方
\d テーブル名
— 例
\d users
— 出力例
Table “public.users”
Column | Type | Nullable | Default
————+——————+———-+———
id | integer | not null | nextval(‘users_id_seq’)
name | character varying(100) | not null |
email | character varying(255) | not null |
created_at | timestamp | | now()
Indexes:
”users_pkey” PRIMARY KEY, btree (id)
このコマンド一つでカラム名・データ型・NULL制約・デフォルト値・インデックス情報が一覧表示されます。
\dコマンドはpsql(PostgreSQLのCLIクライアント)内でのみ使えるメタコマンドです。SQLクライアントツール(DBeaver・pgAdminなど)からは使えないため、その場合はinformation_schemaやpg_catalogを使ったSQLクエリで代替します。
\dコマンドのバリエーション
psqlの\dコマンドにはいくつかのバリエーションがあります。
| コマンド | 表示内容 |
|---|---|
| \d テーブル名 | テーブルの基本構造(カラム・型・制約・インデックス) |
| \d+ テーブル名 | 基本構造+ストレージパラメータ・コメントなど詳細情報 |
| \dt | スキーマ内の全テーブル一覧 |
| \dt テーブル名パターン | 名前パターンに一致するテーブルの一覧(ワイルドカード可) |
| \di テーブル名 | テーブルのインデックス一覧 |
| \ds テーブル名 | テーブルのシーケンス一覧 |
| \df 関数名 | 関数の定義確認 |
\d+ テーブル名はより詳細な情報を表示し、カラムのコメント・パーティション情報・ストレージ設定なども確認できます。
psqlへの接続方法
psqlへの接続方法を確認しておきましょう。
# 基本的な接続コマンド
psql -U ユーザー名 -d データベース名 -h ホスト名 -p ポート番号
# 例:ローカルのpostgresユーザーでmydbに接続
psql -U postgres -d mydb
# 接続後、\dコマンドが使えるようになる
mydb=# \d users
information_schemaを使ったテーブル定義の確認
続いては、SQLクエリでテーブル定義を確認するためのinformation_schemaの使い方を確認していきます。
information_schemaはSQL標準に準拠したメタデータビューのセットで、PostgreSQL以外のRDBMSでも同様の構文が使えます。
カラム情報の確認
information_schema.columnsビューを使ってカラム情報を取得します。
SELECT
column_name, – カラム名
data_type, – データ型
character_maximum_length, — 文字列の最大長
is_nullable, – NULL許可かどうか
column_default – デフォルト値
FROM information_schema.columns
WHERE table_schema = ‘public’
AND table_name = ‘users’
ORDER BY ordinal_position;
このクエリでカラム名・データ型・NULL制約・デフォルト値を一覧表示できます。
table_schema = ‘public’でスキーマを指定し、table_name = ‘users’で対象テーブルを指定します。
制約情報の確認
テーブルの制約(PRIMARY KEY・UNIQUE・CHECK・FOREIGN KEY)もinformation_schemaで確認できます。
— テーブルの制約一覧を確認
SELECT
tc.constraint_name, – 制約名
tc.constraint_type, – 制約の種類(PRIMARY KEY等)
kcu.column_name – 対象カラム名
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name
WHERE tc.table_schema = ‘public’
AND tc.table_name = ‘users’
ORDER BY tc.constraint_type;
外部キー情報の確認
外部キー制約の詳細(参照先テーブル・カラム)を確認するには以下のクエリが有用です。
SELECT
kcu.column_name AS fk_column,
ccu.table_name AS ref_table,
ccu.column_name AS ref_column
FROM information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE tc.constraint_type = ‘FOREIGN KEY’
AND tc.table_name = ‘orders’;
このクエリでordersテーブルが参照している他テーブルとカラムの情報が確認できます。
pg_catalogを使った詳細なテーブル定義確認
続いては、PostgreSQL固有のシステムカタログ(pg_catalog)を使ったより詳細なテーブル定義確認方法を確認していきます。
pg_catalogはPostgreSQL独自のシステム情報を格納するスキーマで、information_schemaより詳細な情報を取得できます。
pg_attributeを使ったカラム情報の確認
SELECT
a.attname AS column_name,
pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type,
a.attnotnull AS not_null,
pg_catalog.pg_get_expr(d.adbin, d.adrelid) AS default_value
FROM pg_catalog.pg_attribute a
LEFT JOIN pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = ‘public.users’::regclass
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY a.attnum;
このクエリはformat_type関数を使うことで、VARCHAR(255)のように長さ情報を含む正確なデータ型表示が得られます。
インデックス情報の確認
テーブルのインデックス情報を確認するにはpg_indexesビューが便利です。
SELECT
indexname, – インデックス名
indexdef – インデックスの定義
FROM pg_indexes
WHERE schemaname = ‘public’
AND tablename = ‘users’;
インデックスの名前・定義(CREATE INDEX文の形式)が確認でき、どのカラムにどの種類のインデックスが張られているかが一目でわかります。
テーブルサイズの確認
テーブルの物理サイズを確認するには以下のクエリが使えます。
SELECT
relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
pg_size_pretty(pg_relation_size(relid)) AS table_size,
pg_size_pretty(pg_total_relation_size(relid) – pg_relation_size(relid)) AS index_size
FROM pg_catalog.pg_statio_user_tables
WHERE relname = ‘users’;
テーブルサイズとインデックスサイズを定期的に確認することで、テーブルの肥大化やインデックスの最適化タイミングを把握できます。
GUIツールでのテーブル定義確認
続いては、GUIツールを使ったテーブル定義確認の方法について確認していきます。
コマンドラインが苦手な方や、ビジュアルで確認したい場合はGUIツールが非常に便利です。
pgAdminでの確認方法
pgAdminはPostgreSQL公式のGUI管理ツールで、テーブル定義の確認が直感的に行えます。
左のオブジェクトツリーから「Databases → スキーマ名 → Tables → テーブル名」と展開し、テーブルを右クリックして「Properties」を選択するとカラム・制約・インデックスなどの詳細が確認できます。
また「Query Tool」でSQLクエリを実行することも可能です。
DBeaverでの確認方法
DBeaverはPostgreSQL以外の多くのデータベースにも対応したマルチプラットフォームのGUIツールです。
テーブルを選択すると「Columns」タブでカラム情報、「Constraints」タブで制約情報、「Indexes」タブでインデックス情報がそれぞれ確認できます。
また「DDL」タブではCREATE TABLE文として定義を確認できる点が特に便利です。
DDLタブで表示されるCREATE TABLE文をそのままコピーすれば、同じ構造のテーブルを別の環境に再現する際にも非常に役立ちます。
まとめ
PostgreSQLのテーブル定義を確認する方法は主に3種類あります。
psqlのメタコマンド\dは最も手軽で、テーブルのカラム・型・制約・インデックスを一覧表示できます。
information_schema.columnsを使ったSQLクエリはSQL標準に準拠しており、GUIツールやアプリケーションからも実行可能です。
pg_catalogを使うとPostgreSQL固有の詳細情報(正確な型定義・サイズ情報など)を取得できます。
用途に応じてpsqlコマンド・SQLクエリ・GUIツールを使い分けることで、効率的にテーブル定義を確認できるでしょう。