◀ 14.

【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法

▶

Db2 LUWでschema配下の列定義を調べるにはSYSCAT.COLUMNSを使います。表/ビュー等の対象種別と正確な識別子を決めてから検索します。

Db2の正確な識別子と対象種別から列カタログを取得して定義を読み分ける図

この記事の要点
  • Db2(LUW)では、全カラムの定義がカタログビュー SYSCAT.COLUMNS に入っている
  • 基本: SELECT * FROM SYSCAT.COLUMNS WHERE TABSCHEMA = 'スキーマ名'
  • 通常識別子は大文字、引用識別子は指定の文字を保持する。カタログの正確な名前と条件を合わせる
  • 実用的には TABNAME, COLNO, COLNAME, TYPENAME, LENGTH, SCALE, NULLS, DEFAULT, REMARKS に絞って並べ替える
  • ビューを除いて表だけにしたいときは SYSCAT.TABLES と結合して TYPE = 'T' で絞る
  • z/OS 版の Db2 ではカタログが異なり SYSIBM.SYSCOLUMNS を使う

結論: SYSCAT.COLUMNS をスキーマ名で絞る

Db2 for Linux, UNIX and Windows(LUW)では、「SYSCAT.COLUMNS」カタログビューにデータベース内のすべてのカラム情報が格納されています。TABSCHEMA カラムにスキーマ名を条件として指定することで、対象のスキーマを絞ることができます。

SELECT * FROM SYSCAT.COLUMNS WHERE TABSCHEMA = 'SCHEMA_NAME'

SYSCAT.COLUMNSは表/ビュー/nickname等の列を確認するカタログです。対象DB・schema・参照権限と対象種別を確認し、一覧を読めることと実データのSELECT権限を混同しないでください。

実用的なクエリ: 必要な列に絞って並べる

SELECT * では列が多すぎて読みにくいため、テーブル定義書を作るような用途では次のように列を選び、テーブル名とカラムの順番で並べ替えます。

SELECT
    TABNAME,
    COLNO,
    COLNAME,
    TYPENAME,
    LENGTH,
    SCALE,
    NULLS,
    DEFAULT,
    KEYSEQ,
    REMARKS
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA = 'SCHEMA_NAME'
ORDER BY TABNAME, COLNO

主な列の意味

列名内容
TABSCHEMAスキーマ名
TABNAME表(またはビュー)の名前
COLNAMEカラム名
COLNO表の中でのカラムの位置(0 から始まる)
TYPENAMEデータ型名(VARCHAR、INTEGER、DECIMAL、TIMESTAMP など)
LENGTH型ごとに意味/単位を確認。DECIMALは精度で、文字列も常に見た目の文字数とは限らない
SCALEDECIMAL の小数部の桁数
NULLSNULL を許可するなら 'Y'、NOT NULL なら 'N'
DEFAULT既定値を表す式等。NULLの意味は型/定義を確認し、ここだけで元DDLの省略と明示NULLを復元しない
KEYSEQ主キーを構成する列なら、その中での順番。主キーでなければ NULL
IDENTITYID 列(自動採番)なら 'Y'
REMARKSCOMMENT ON COLUMN で付けたコメント

条件を追加して絞り込む

特定のテーブルだけ

SELECT COLNO, COLNAME, TYPENAME, LENGTH, SCALE, NULLS
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA = 'SCHEMA_NAME'
  AND TABNAME = 'TABLE_NAME'
ORDER BY COLNO

ビューを除いて表だけ

SYSCAT.COLUMNS にはビューのカラムも含まれます。次のTYPE=Tは通常の非型付き表に限定する例です。typed table、MQT、作成済み一時表等まで含む「全種類の表」とは異なるため、対象種別はSYSCAT.TABLESの資料で選びます。

SELECT c.TABNAME, c.COLNO, c.COLNAME, c.TYPENAME, c.LENGTH, c.NULLS
FROM SYSCAT.COLUMNS c
JOIN SYSCAT.TABLES t
  ON t.TABSCHEMA = c.TABSCHEMA
 AND t.TABNAME   = c.TABNAME
WHERE c.TABSCHEMA = 'SCHEMA_NAME'
  AND t.TYPE = 'T'
ORDER BY c.TABNAME, c.COLNO

SYSCAT.TABLES の TYPE は、'T' が表、'V' がビュー、'A' が別名(エイリアス)などを表します。

特定のカラム名を持つテーブルを探す

次の旧LIKE例の_は任意の1文字です。CUSTOMER_IDの文字列にある_もワイルドカードなので、CUSTOMERXID等に一致し得ます。正確な列名なら下のCOLNAME=?の等値検索を使い、部分一致が必要ならLIKEのescapeと入力値の扱いを設計します。

SELECT TABSCHEMA, TABNAME, COLNAME, TYPENAME
FROM SYSCAT.COLUMNS
WHERE COLNAME LIKE '%CUSTOMER_ID%'
ORDER BY TABSCHEMA, TABNAME

列名の候補検索に使えますが、実データやSQLの利用箇所、ビュー/ルーチン/アプリの全依存先を網羅する影響調査ではありません。

落とし穴

  • 大文字・小文字: 通常識別子は大文字で保存されますが、引用識別子では小文字等も正確な名前です。検索値やカタログ列を一律にUPPER()で変えると異なる対象を区別できなくなります。0件のときは接続先と正確な名前を照合します。
  • 引用符付きで作られた名前: CREATE TABLE "MyTable" のように引用符付きで作成した場合は、大文字小文字がそのまま保存されます。UPPER(TABNAME)による部分一致は候補探索に限り、保存された名前そのものを返して区別します。候補名を確定せずDDLや実データ照会へ自動転用しないでください。
  • システムスキーマ: スキーマを指定しないと SYSCAT や SYSIBM などのシステムカタログのカラムまで大量に返ります
  • z/OS 版との違い: Db2 for z/OS には SYSCAT ビューがなく、SYSIBM.SYSCOLUMNS を使います。列名も TBCREATOR(スキーマ)、TBNAME(表名)、NAME(カラム名)、COLTYPE(型)のように異なります

SQL 以外で確認する方法

1表の列確認にはCLPのDESCRIBEも使えます。下はシェルからDb2 CLPへ渡す例です。SAMPLE/SCHEMA_NAME/TABLE_NAMEは確認済みの対象へ置き換え、引用識別子とOSシェルの引用を分けて確認します。

db2 connect to SAMPLE
db2 "DESCRIBE TABLE SCHEMA_NAME.TABLE_NAME"

CREATE TABLE 文(DDL)として出力したい場合は db2look コマンドを使います。詳しくは テーブル定義からDDL(CREATE TABLE)を生成する方法 を参照してください。

関連

値をバインドして通常表の列を一覧にする

次の例は指定schemaのTYPE=Tに限ります。?へ正確なschema名を1つバインドし、schema/表/列位置で並べます。同じ表名が別schemaにある場合も、JOINの両キーを省略しません。?付きの文はアプリ用で、そのままCLPへ貼る完成例ではありません。

SELECT c.TABSCHEMA, c.TABNAME, c.COLNO, c.COLNAME,
       c.TYPENAME, c.LENGTH, c.SCALE, c.NULLS,
       c."DEFAULT" AS COLUMN_DEFAULT,
       c.IDENTITY, c.GENERATED, c.KEYSEQ, c.REMARKS
FROM SYSCAT.COLUMNS c
JOIN SYSCAT.TABLES t
  ON t.TABSCHEMA = c.TABSCHEMA
 AND t.TABNAME = c.TABNAME
WHERE c.TABSCHEMA = ?
  AND t.TYPE = 'T'
ORDER BY c.TABSCHEMA, c.TABNAME, c.COLNO;

DEFAULTはCOLUMN_DEFAULTという別名で返します。GENERATEDのA/DやIDENTITYも併せて確認し、生成列・IDENTITY・既定値を同じものと扱わないでください。コメント/既定式には内部情報やHTML記号も含み得るため、Webへ表示するなら出力文脈に合わせてエスケープし、スプレッドシートへ出力する場合も数式等の扱いを別途検討します。

正確なカラム名を探す

?へschema名、列名の順にバインドします。%や_、引用符を名前に含んでいても、等値条件ではLIKEのワイルドカードにはなりません。バインドは値を分離するためのもので、schema/表名を入力から直接SQL文字列へ連結する代替ではありません。

SELECT TABSCHEMA, TABNAME, COLNAME, TYPENAME
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA = ?
  AND COLNAME = ?
ORDER BY TABSCHEMA, TABNAME, COLNO;

列一覧で分かること・分からないこと

  • COLNOは0始まりです。欠落や将来の追加を考慮し、表示行数だけから常に連続番号だと仮定しません。
  • LENGTH/SCALEだけで文字列の使用可能文字数や全型の精度を決めず、型と文字列単位・文字コードを公式資料で確認します。NULLS=Nでも空文字や0を禁止する意味ではありません。
  • KEYSEQは主キー内の位置の情報で、UNIQUE/外部キー/検査制約・索引全体の一覧ではありません。列一覧だけを完全なCREATE TABLE/移行設計書としません。
  • 採取の前後にDDLが変わると比較条件も変わります。接続先・採取時刻・対象版/種別と権限を記録し、本番で参照のために強いロックや設定変更を加えません。

IDENTITYとシーケンスの確認 / 1表の列定義 / Db2親ページの子ページから選択してください。元の関連節のMySQL/information_schema記事は比較資料で、Db2のカタログ構文と混ぜません。

公式:SYSCAT.COLUMNS / SYSCAT.TABLESの対象種別。

対象範囲と検証

主にDb2 LUWを対象とし、2026年10月に公式資料と照合しました。既存のコード/見出し/画像/リンクを保持し、誤案内には近接した訂正を加えました。追加SQLの条件・順序等はメモリ内の合成データで確認しましたが、Db2実機の構文/権限/ロック/負荷・全構成での変更成功を検証したものではありません。Db2親ページの子ページから選択してください。

子ページ

子ページはありません

同階層のページ
  1. DB接続コマンド
  2. データベース一覧の確認
  3. テーブル一覧の確認
  4. テーブル定義の確認
  5. DBの設定確認
  6. テーブルスペースの容量の確認および拡張
  7. データ型
  8. 複数カラムのUPDATE
  9. カラムの追加/削除/変更
  10. 自動番号付け (autoincrement) する方法
  11. インデックスの作成
  12. シーケンスおよびインクリメント(ID列)の違いと確認方法
  13. create table文の生成
  14. 特定スキーマの全テーブルの全カラム情報を取得する方法
  15. 【DB2】エラー一覧
  16. 【DB2】テーブル定義からCREATE TABLE文を生成する方法

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