◀ 14.

【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'

これで、指定したスキーマにあるすべての表・ビューの、すべてのカラムが 1 行ずつ返ります。

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

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)
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 にはビューのカラムも含まれます。表だけにしたい場合は SYSCAT.TABLES と結合し、TYPE が 'T'(表)のものに絞ります。

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' が別名(エイリアス)などを表します。

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

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

影響調査で「この項目を使っている表はどれか」を調べるときに便利です。

落とし穴

  • 大文字・小文字: Db2 は引用符なしで作成した名前を大文字で格納します。TABSCHEMA = 'myschema' のように小文字で書くと 0 件になるので、大文字で指定するか UPPER() を使います
  • 引用符付きで作られた名前: CREATE TABLE "MyTable" のように引用符付きで作成した場合は、大文字小文字がそのまま保存されます。0 件のときは UPPER(TABNAME) LIKE '%MYTABLE%' のように大文字にそろえた部分一致で実際の名前を確認してください
  • システムスキーマ: スキーマを指定しないと SYSCAT や SYSIBM などのシステムカタログのカラムまで大量に返ります
  • z/OS 版との違い: Db2 for z/OS には SYSCAT ビューがなく、SYSIBM.SYSCOLUMNS を使います。列名も TBCREATOR(スキーマ)、TBNAME(表名)、NAME(カラム名)、COLTYPE(型)のように異なります

SQL 以外で確認する方法

コマンド行プロセッサ(CLP)からなら、1 つのテーブルの定義は DESCRIBE で確認できます。

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

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

関連

Post Share
子ページ

子ページはありません

同階層のページ
  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文を生成する方法