24.

MySQL / MariaDB で information_schema.columns から特定スキーマの全カラム情報を取得する方法

編集
この記事の要点
  • information_schema.columns にはサーバ上のすべてのカラム情報が格納されている
  • table_schema 列でデータベース(スキーマ)名を絞り込み、特定の DB のみを対象にできる
  • 取得できる情報はカラム名・データ型・NULL 許可・デフォルト値・コメントなど多岐にわたる
  • SHOW COLUMNS はテーブル単位だが、information_schema.columns はクロステーブルで一括取得できるのが強み
  • 型変更前の影響調査・コーディング用のドキュメント生成・命名規則チェックなどに使える

information_schema.columns とは

information_schema は MySQL / MariaDB が標準で持つメタデータ用データベースで、サーバ上のすべてのデータベース・テーブル・カラム・インデックスなどの情報を SQL で参照できるようにしたものです。その中の columns ビューにはすべてのカラム情報が 1 行 1 カラムの形で格納されています。

基本クエリ

特定のスキーマ(データベース)に絞って全カラムを取得する最小クエリです。

SELECT *
FROM   information_schema.columns
WHERE  table_schema = 'スキーマ名';

table_schema はデータベース名と同義です(MySQL では「スキーマ」と「データベース」は同じ意味)。

よく使う列の絞り込み

SELECT * だと 20 列以上返ってくるので、実務では必要な列だけ取り出すのが一般的です。

SELECT
    table_name,
    column_name,
    column_type,
    is_nullable,
    column_default,
    column_comment
FROM   information_schema.columns
WHERE  table_schema = 'mydb'
ORDER  BY table_name, ordinal_position;

information_schema.columns の主な列

列名内容
table_schemaデータベース名
table_nameテーブル名
column_nameカラム名
ordinal_positionカラムの並び順(1 始まり)
column_defaultデフォルト値
is_nullableNULL 可かどうか(YES / NO)
data_type型のみ(int / varchar など)
column_type型 + 長さ + UNSIGNED など完全な表記
character_maximum_length文字列型の最大長
numeric_precision / numeric_scale数値型の桁数
column_keyPRI / UNI / MUL(インデックス種別)
extraauto_increment などの補足
column_commentカラムコメント

実務でよくあるパターン

1. NULL 許可カラムだけを一覧

SELECT table_name, column_name
FROM   information_schema.columns
WHERE  table_schema = 'mydb'
  AND  is_nullable  = 'YES';

2. 特定の型を使っているカラムを洗い出す

-- TEXT / BLOB を使っているカラム
SELECT table_name, column_name, column_type
FROM   information_schema.columns
WHERE  table_schema = 'mydb'
  AND  data_type IN ('text','mediumtext','longtext','blob');

3. コメント未設定のカラムを抽出

SELECT table_name, column_name
FROM   information_schema.columns
WHERE  table_schema = 'mydb'
  AND  (column_comment IS NULL OR column_comment = '');

4. 同じカラム名がどのテーブルに存在するか

SELECT table_name
FROM   information_schema.columns
WHERE  table_schema = 'mydb'
  AND  column_name  = 'user_id';

SHOW COLUMNS との違い

項目SHOW COLUMNSinformation_schema.columns
対象範囲1 テーブルのみサーバ全体・複数テーブル横断
WHERE 句不可(簡易フィルタのみ)SQL の WHERE で自由に絞り込み
JOIN不可他テーブルと JOIN 可能
用途対話的な確認調査・スキャン・ドキュメント生成

注意点

  • 権限: information_schema はユーザが見える範囲(GRANT されたオブジェクト)しか返さない
  • 大文字小文字: table_schema は OS によって大文字小文字を区別する場合がある(lower_case_table_names 設定に依存)
  • パフォーマンス: 全テーブルスキャンに近い動きをするため、本番稼働中の DB で多用しない

ドキュメント生成への応用

取得結果を Markdown 表に整形すれば、ER 図や設計書のカラム一覧ドキュメントとして再利用できます。MySQL CLI の --batch オプションでタブ区切り出力に切り替えると整形が楽です。

mysql -u root -p --batch -e "
  SELECT table_name, column_name, column_type,
         IF(is_nullable='YES','可','不可') AS null_ok,
         IFNULL(column_comment,'') AS comment
  FROM   information_schema.columns
  WHERE  table_schema = 'mydb'
  ORDER  BY table_name, ordinal_position
" > mydb_columns.tsv

TSV を awk や Python で読んでテーブル単位の Markdown を吐き出せば、CI で「最新スキーマの設計書」を自動更新できます。

命名規則チェックの例

命名規則違反(例: snake_case 統一なのに camelCase が混入)を一発で検出できます。

-- 大文字を含むカラム名(snake_case 違反)
SELECT table_name, column_name
FROM   information_schema.columns
WHERE  table_schema = 'mydb'
  AND  BINARY column_name REGEXP '[A-Z]';

関連

  • MySQL & MariaDB — 親カテゴリ
  • SELECT文 — 取得 SQL の基本
  • WHERE句 — 絞り込み条件
  • SHOW COLUMNS / DESCRIBE — 単一テーブルのカラム表示
  • information_schema.tables — テーブル一覧
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ダウンロード&インストール方法(Windows)
  2. インストール方法(Linux)
  3. コマンド一覧
  4. SQL
  5. データ型
  6. 関数
  7. 管理ツール
  8. 設定
  9. パフォーマンスチューニング関連
  10. エクスポートおよびインポート
  11. エラー&トラブル
  12. 文字コードの確認
  13. 実行中の SQL の状態確認およびプロセスキルの方法
  14. パスワードの無効化設定
  15. root ユーザーの初期パスワード確認方法
  16. rootユーザーのパスワード変更方法
  17. LIMIT, OFFSET の始まりと挙動
  18. mysqlのバージョン確認方法
  19. MySQLで実行計画を表示する方法
  20. レプリケーションのステータス確認方法
  21. 中央値の導き方(バージョン8未満)
  22. 階層SQL(バージョン8未満)
  23. パーセンタイルの導き方
  24. 特定スキーマの全テーブルの全カラム情報を取得する方法

最近更新/作成されたページ