DB2 4 min read

Db2のNOT NULLエラーに列名が出ない ― TBSPACEID・TABLEID・COLNOの逆引き

NOT NULL の列に NULL を入れようとすると、Db2 は次のエラーを返します。列名の代わりに番号が出ます。

SQL0407N  Assignment of a NULL value to a NOT NULL column "TBSPACEID=3,
TABLEID=5, COLNO=1" is not allowed.  SQLSTATE=23502

まず見る(結論)

3つの番号をカタログで引くと、表と列が分かります。COLNO は 0 から数えます。

SELECT T.TABSCHEMA, T.TABNAME, C.COLNAME
  FROM SYSCAT.TABLES T
  JOIN SYSCAT.COLUMNS C
    ON C.TABSCHEMA = T.TABSCHEMA AND C.TABNAME = T.TABNAME
 WHERE T.TBSPACEID = 3 AND T.TABLEID = 5 AND C.COLNO = 1

列が分かったら、その列に NULL を渡している経路を下の表で探します。

症状 → 原因 → 対処(逆引き)

症状 よくある原因 まず打つ手
INSERT で出る。その列を書いていない 既定値の無い NOT NULL 列を省略した 列リストに足す/WITH DEFAULT を付ける
WITH DEFAULT の列なのに出る アプリが NULL を明示している 値が無いときは列ごと省略する
UPDATE で出る 更新値が NULL(式やサブクエリの結果を含む) COALESCE で置き換える
INSERT ... SELECT で出て、1行も入らない 元の行のどれかが NULL(外部結合の相手が無い行など) WHERE 列 IS NULL で数える/COALESCE
IMPORT の rejected が 0 でない 空のフィールドの行が SQL3116W で捨てられた 警告の行番号で入力ファイルを直す

省略・NULL の明示・UPDATE・INSERT ... SELECT のどれでも、メッセージは同じ番号の SQL0407N でした。どの文で出たかはアプリのログで確かめます。

それでも切り分けられないとき(実機ログつきの詳解)

SYSCAT.COLUMNS の NULLS / DEFAULT の見方、WITH DEFAULT の列に NULL を明示したときの結果、IMPORT が行を捨てて終了コード 2 で終わる例は、Zennのフル記事にまとめています。

▶ Zennで続きを読む(無料)

Db2のSQL0407N ― TBSPACEID・TABLEID・COLNOから列を特定してNULLの出どころを探す


実機ログつきの詳解を読む →

この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。

現場で引ける Db2 の教科書

現場で引ける!Db2実践エンジニア・バイブル

Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。

アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。

Zennで読む →