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のフル記事にまとめています。
この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。