PostgreSQLテーブル・カラム一覧確認方法|psqlとSQLの実用完全ガイド

データベース・SQL

「このデータベースにはどんなテーブルがあるの?」
「各テーブルにはどんなカラムが定義されているの?」
「データ型や制約も一緒に確認したい」

PostgreSQLを使っていると、こうした疑問が頻繁に出てきます。

特に、他の人が作ったデータベースを引き継いだときや、大きなプロジェクトで多数のテーブルがあるときには、データベースの構造を素早く把握することがとても重要です。

この記事では、PostgreSQLでテーブル一覧とカラム一覧を効率的に確認する方法を、psqlコマンドとSQLクエリの両方で、初心者でもわかるように詳しく解説していきます。

スポンサーリンク

PostgreSQLでの情報確認方法の種類

psqlメタコマンドとは?

PostgreSQLのpsql(コマンドラインツール)には、メタコマンドという便利な機能があります。

これは、バックスラッシュ(\)で始まる特別なコマンドで、データベースの構造を素早く確認できます。

メタコマンドの特徴:

  • 短いコマンドで情報を取得
  • 見やすい形式で表示
  • 対話的に使いやすい

information_schemaとは?

information_schemaは、SQL標準で定義されたシステムビューの集合です。

データベースの構造情報(メタデータ)がテーブル形式で格納されています。

information_schemaの特徴:

  • SQL標準なので他のデータベースでも共通
  • プログラムから利用しやすい
  • 複雑な条件での抽出が可能

説明: メタコマンドは人間が見るのに適しており、information_schemaはプログラムで処理するのに適しています。

: 簡単な確認作業はメタコマンド、レポート作成や自動化にはinformation_schemaを使うといった使い分けができます。

テーブル一覧を確認する方法

psqlメタコマンドでテーブル一覧を表示

基本的なテーブル一覧表示:

\dt

説明: 現在接続しているデータベースの、現在のスキーマにあるテーブル一覧を表示します。

: 実行結果の例

         List of relations
 Schema |    Name    | Type  |  Owner   
--------+------------+-------+----------
 public | customers  | table | postgres
 public | orders     | table | postgres
 public | products   | table | postgres
 public | users      | table | postgres
(4 rows)

すべてのスキーマのテーブルを表示:

\dt *.*

特定のスキーマのテーブルを表示:

\dt public.*
\dt sales.*

説明: スキーマ名を指定することで、特定のスキーマのテーブルのみを表示できます。

より詳細な情報を含む表示

詳細情報付きのテーブル一覧:

\dt+

説明: テーブルサイズやコメントなどの詳細情報も一緒に表示されます。

: 実行結果の例

                          List of relations
 Schema |    Name    | Type  |  Owner   |    Size    | Description 
--------+------------+-------+----------+------------+-------------
 public | customers  | table | postgres | 128 kB     | 顧客情報
 public | orders     | table | postgres | 2568 kB    | 注文データ
 public | products   | table | postgres | 64 kB      | 商品マスタ
 public | users      | table | postgres | 96 kB      | ユーザー情報
(4 rows)

パターンマッチングでのフィルタリング

特定の文字を含むテーブルを表示:

\dt *user*
\dt customer*

説明: ワイルドカード(*)を使って、特定のパターンに一致するテーブルのみを表示できます。

SQLでテーブル一覧を取得

基本的なテーブル一覧取得:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public' 
  AND table_type = 'BASE TABLE'
ORDER BY table_name;

説明: information_schemaを使って、SQLクエリでテーブル一覧を取得します。table_type = 'BASE TABLE'を指定することで、ビューを除外できます。

: 実行結果の例

 table_name 
------------
 customers
 orders
 products
 users
(4 rows)

詳細情報も一緒に取得:

SELECT 
    table_schema AS スキーマ名,
    table_name AS テーブル名,
    table_type AS テーブル種別
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'pg_catalog')
ORDER BY table_schema, table_name;

説明: スキーマ名やテーブル種別も一緒に表示し、システム用のスキーマは除外しています。

カラム一覧を確認する方法

psqlメタコマンドでカラム一覧を表示

特定テーブルのカラム構造を表示:

\d テーブル名

説明: 指定したテーブルの詳細な構造(カラム名、データ型、制約など)を表示します。

: usersテーブルの構造確認

\d users

実行結果の例:

                     Table "public.users"
  Column   |          Type          | Collation | Nullable | Default 
-----------+------------------------+-----------+----------+---------
 user_id   | integer                |           | not null | nextval('users_user_id_seq'::regclass)
 username  | character varying(50)  |           | not null | 
 email     | character varying(100) |           | not null | 
 created_at| timestamp with time zone|          |          | now()
Indexes:
    "users_pkey" PRIMARY KEY, btree (user_id)
    "users_email_key" UNIQUE CONSTRAINT, btree (email)

カラム情報だけを簡潔に表示:

\d+ テーブル名

説明: より詳細な情報(ストレージ情報、統計情報など)も表示されます。

SQLでカラム一覧を取得

すべてのテーブルのカラム一覧:

SELECT 
    table_name AS テーブル名,
    column_name AS カラム名,
    data_type AS データ型,
    is_nullable AS NULL許可,
    column_default AS デフォルト値
FROM information_schema.columns
WHERE table_schema = 'public'
ORDER BY table_name, ordinal_position;

説明: 指定したスキーマ内のすべてのテーブルのカラム情報を一覧で取得します。ordinal_positionでソートすることで、テーブル定義時の順序で表示されます。

: 実行結果の例

 テーブル名 | カラム名  | データ型    | NULL許可 | デフォルト値
-----------|----------|-------------|----------|----------------
 customers | customer_id | integer   | NO       | nextval('customers_customer_id_seq'::regclass)
 customers | name     | varchar(100)| NO       | 
 customers | email    | varchar(100)| YES      | 
 orders    | order_id | integer     | NO       | nextval('orders_order_id_seq'::regclass)
 orders    | customer_id | integer  | NO       | 
 orders    | order_date | date      | NO       | CURRENT_DATE

特定テーブルのカラム情報のみ:

SELECT 
    column_name AS カラム名,
    data_type AS データ型,
    character_maximum_length AS 最大長,
    is_nullable AS NULL許可,
    column_default AS デフォルト値
FROM information_schema.columns
WHERE table_name = 'users' 
  AND table_schema = 'public'
ORDER BY ordinal_position;

説明: 特定のテーブルのカラム情報のみを詳しく表示します。文字列型の場合は最大長も確認できます。

より高度な情報取得

制約情報も含めたカラム一覧

SELECT 
    c.table_name AS テーブル名,
    c.column_name AS カラム名,
    c.data_type AS データ型,
    c.is_nullable AS NULL許可,
    CASE 
        WHEN tc.constraint_type = 'PRIMARY KEY' THEN 'PK'
        WHEN tc.constraint_type = 'FOREIGN KEY' THEN 'FK'
        WHEN tc.constraint_type = 'UNIQUE' THEN 'UQ'
        ELSE ''
    END AS 制約
FROM information_schema.columns c
LEFT JOIN information_schema.key_column_usage kcu
    ON c.table_name = kcu.table_name 
    AND c.column_name = kcu.column_name
    AND c.table_schema = kcu.table_schema
LEFT JOIN information_schema.table_constraints tc
    ON kcu.constraint_name = tc.constraint_name
    AND kcu.table_schema = tc.table_schema
WHERE c.table_schema = 'public'
ORDER BY c.table_name, c.ordinal_position;

説明: カラム情報に加えて、主キー、外部キー、ユニーク制約の情報も一緒に表示します。

コメント情報も含める

SELECT 
    c.table_name AS テーブル名,
    c.column_name AS カラム名,
    c.data_type AS データ型,
    c.is_nullable AS NULL許可,
    pgd.description AS コメント
FROM information_schema.columns c
LEFT JOIN pg_catalog.pg_statio_all_tables st 
    ON c.table_schema = st.schemaname 
    AND c.table_name = st.relname
LEFT JOIN pg_catalog.pg_description pgd 
    ON pgd.objoid = st.relid
    AND pgd.objsubid = c.ordinal_position
WHERE c.table_schema = 'public'
ORDER BY c.table_name, c.ordinal_position;

説明: PostgreSQL特有のコメント機能で設定されたカラムの説明も一緒に表示します。

検索とフィルタリング

特定の条件でテーブルを検索

テーブル名に特定の文字を含む:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
  AND table_name LIKE '%user%'
  AND table_type = 'BASE TABLE';

作成日時が新しいテーブル:

SELECT 
    schemaname AS スキーマ名,
    tablename AS テーブル名,
    tableowner AS 所有者
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename;

特定の条件でカラムを検索

特定のデータ型のカラムを検索:

SELECT 
    table_name AS テーブル名,
    column_name AS カラム名,
    data_type AS データ型
FROM information_schema.columns
WHERE table_schema = 'public'
  AND data_type IN ('text', 'varchar', 'character varying')
ORDER BY table_name, column_name;

説明: テキスト系のデータ型を持つカラムを一覧で表示します。

特定の名前パターンのカラムを検索:

SELECT 
    table_name AS テーブル名,
    column_name AS カラム名,
    data_type AS データ型
FROM information_schema.columns
WHERE table_schema = 'public'
  AND column_name LIKE '%_id'
ORDER BY table_name, column_name;

説明: 「_id」で終わるカラム名(主に主キーや外部キー)を検索します。

NULL許可されていないカラムを検索:

SELECT 
    table_name AS テーブル名,
    column_name AS カラム名,
    data_type AS データ型
FROM information_schema.columns
WHERE table_schema = 'public'
  AND is_nullable = 'NO'
ORDER BY table_name, ordinal_position;

システム情報の確認

データベース一覧の確認

psqlメタコマンド:

\l

SQL:

SELECT datname AS データベース名
FROM pg_database
WHERE datistemplate = false
ORDER BY datname;

スキーマ一覧の確認

psqlメタコマンド:

\dn

SQL:

SELECT schema_name AS スキーマ名
FROM information_schema.schemata
WHERE schema_name NOT LIKE 'pg_%'
  AND schema_name != 'information_schema'
ORDER BY schema_name;

インデックス一覧の確認

psqlメタコマンド:

\di

特定テーブルのインデックス:

\d テーブル名

SQL:

SELECT 
    schemaname AS スキーマ名,
    tablename AS テーブル名,
    indexname AS インデックス名,
    indexdef AS インデックス定義
FROM pg_indexes
WHERE schemaname = 'public'
ORDER BY tablename, indexname;

実践的な使用例

データベース設計書の自動生成

SELECT 
    t.table_name AS テーブル名,
    obj_description(c.oid) AS テーブルコメント,
    col.column_name AS カラム名,
    col.data_type AS データ型,
    CASE 
        WHEN col.character_maximum_length IS NOT NULL 
        THEN col.data_type || '(' || col.character_maximum_length || ')'
        WHEN col.numeric_precision IS NOT NULL AND col.numeric_scale IS NOT NULL
        THEN col.data_type || '(' || col.numeric_precision || ',' || col.numeric_scale || ')'
        ELSE col.data_type
    END AS 詳細データ型,
    CASE WHEN col.is_nullable = 'YES' THEN 'YES' ELSE 'NO' END AS NULL許可,
    col.column_default AS デフォルト値,
    col_description(c.oid, col.ordinal_position) AS カラムコメント
FROM information_schema.tables t
JOIN information_schema.columns col
    ON t.table_name = col.table_name
    AND t.table_schema = col.table_schema
JOIN pg_class c ON c.relname = t.table_name
WHERE t.table_schema = 'public'
  AND t.table_type = 'BASE TABLE'
ORDER BY t.table_name, col.ordinal_position;

説明: データベース設計書作成に必要な情報を網羅的に取得します。

外部キー関係の確認

SELECT 
    tc.table_name AS 子テーブル,
    kcu.column_name AS 子カラム,
    ccu.table_name AS 親テーブル,
    ccu.column_name AS 親カラム,
    tc.constraint_name AS 制約名
FROM information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
    ON tc.constraint_name = kcu.constraint_name
    AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
    ON ccu.constraint_name = tc.constraint_name
    AND ccu.table_schema = tc.table_schema
WHERE tc.constraint_type = 'FOREIGN KEY'
  AND tc.table_schema = 'public'
ORDER BY tc.table_name, kcu.column_name;

説明: テーブル間の外部キー関係を一覧で確認できます。

パフォーマンスとベストプラクティス

効率的な情報取得

少ないクエリで多くの情報を取得:

WITH table_info AS (
    SELECT 
        t.table_name,
        obj_description(c.oid) as table_comment,
        pg_size_pretty(pg_total_relation_size(c.oid)) as table_size
    FROM information_schema.tables t
    JOIN pg_class c ON c.relname = t.table_name
    WHERE t.table_schema = 'public'
      AND t.table_type = 'BASE TABLE'
)
SELECT 
    ti.table_name AS テーブル名,
    ti.table_comment AS テーブルコメント,
    ti.table_size AS テーブルサイズ,
    COUNT(col.column_name) AS カラム数
FROM table_info ti
JOIN information_schema.columns col
    ON ti.table_name = col.table_name
WHERE col.table_schema = 'public'
GROUP BY ti.table_name, ti.table_comment, ti.table_size
ORDER BY ti.table_name;

大規模データベースでの注意点

システムスキーマの除外:

WHERE table_schema NOT IN ('information_schema', 'pg_catalog', 'pg_toast')

必要な情報のみを取得:

-- 必要最小限の情報のみ
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'public'
  AND table_name = '特定のテーブル名';

よくある問題と対処法

問題1: 権限不足でテーブルが見えない

確認方法:

SELECT current_user;
\du

対処法: 適切な権限を付与してもらう

GRANT USAGE ON SCHEMA public TO ユーザー名;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ユーザー名;

問題2: 大文字小文字の問題

PostgreSQLは識別子を小文字に変換します。大文字を含むテーブル名は二重引用符で囲む必要があります。

\d "MyTable"

問題3: psqlメタコマンドが使えない

psql以外のツール(pgAdminなど)ではメタコマンドは使用できません。SQLクエリを使用してください。

セキュリティの考慮事項

権限の適切な設定

情報スキーマへのアクセスも権限管理の対象です:

-- 読み取り専用ユーザーの作成
CREATE USER readonly_user WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE database_name TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;

機密情報の考慮

テーブル名やカラム名から機密情報が推測される可能性があるため、外部公開時は注意が必要です。

まとめ

PostgreSQLでテーブル一覧とカラム一覧を確認する方法は、用途に応じて使い分けることが重要です。

基本的な確認方法

  • psqlメタコマンドによる対話的な確認
  • information_schemaを使ったSQLクエリ
  • 目的に応じた詳細度の調整

実用的な活用

  • データベース設計書の自動生成
  • システム間のデータ連携確認
  • 開発効率の向上

効率的な運用

  • コマンドとSQLの使い分け
  • 適切な権限管理
  • パフォーマンスを考慮した情報取得

確認方法別まとめ表

方法用途特徴適用場面
\dtテーブル一覧確認高速、見やすい対話的な確認
\d テーブル名カラム詳細確認詳細、制約も表示開発時の構造確認
information_schema汎用的な情報取得プログラム対応自動化、レポート作成
pg_catalogPostgreSQL固有情報より詳細高度な分析

コメント

タイトルとURLをコピーしました