この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:12:00

タイトル: SQL3100W Column number XXX in row XXX is missing in the input file, but the target column is not nullable.
SEOタイトル: DB2 SQL3100W「Column number is missing」LOAD 入力ファイル列不足の解消法

この記事の要点
  • SQL3100W は IBM DB2 の LOAD / IMPORT ユーティリティが出す警告。入力ファイルの列数が不足
  • 具体的には "ターゲット列が NOT NULL なのに入力ファイル側に該当列が無い" 状態
  • 原因: CSV 列数不一致 / DEL 区切り文字ミスマッチ / METHOD P/L 指定間違い / ヘッダ行混入
  • 対処: 入力ファイル列数を確認 → METHOD P (1,2,3,...)MODIFIED BY オプションで明示
  • NULLABLE 列なら警告のみで処理続行、NOT NULL 列だと SQL3185W (拒否行) も併発する

エラーメッセージ

SQL3100W  The column number "XXX" in row number "XXX" and column "XXX"
is missing in the input file, but the target column is not nullable.

SQL3185W  The previous error occurred while processing data from row "XXX"
of the input file.

IBM DB2 の LOAD / IMPORT / db2 LOAD CLIENT ユーティリティでデータをロードする際、入力ファイルの列数が不足していると出る警告です。NOT NULL 制約の列を埋められないため、該当行が拒否されます。

原因と対処早見表

原因確認対処
入力 CSV の列数不足1 行 1 列の数を awk -F, '{print NF}' で確認列を補う or NULL 許可
区切り文字違いCSV なのに TAB だったりMODIFIED BY COLDEL= 指定
METHOD 不一致テーブル定義列順とファイル列順が違うMETHOD P (1,2,3) 明示
ヘッダ行を含めて LOAD1 行目が文字列で型違反MODIFIED BY SKIPCOUNT=1
改行コード混入VARCHAR 内に CR/LFMODIFIED BY DELPRIORITYCHAR や CSV 整備

基本構文の確認

-- 典型的な LOAD コマンド
LOAD FROM data.csv OF DEL
  MODIFIED BY COLDEL,           -- 区切り文字をカンマに
            CHARDEL'"'           -- 文字列引用符
            SKIPCOUNT=1          -- 先頭1行スキップ(ヘッダ)
  METHOD P (1,2,3,4)             -- 1〜4列目を使う
  REPLACE INTO MYSCHEMA.USERS (ID, NAME, EMAIL, CREATED_AT)
  NONRECOVERABLE;

対処1: 入力ファイルの列数を数える

# CSV の列数を確認
head -1 data.csv | awk -F, '{print NF}'
# → 5  ← テーブル列数と一致しているか?

# 行ごとに列数が違う行を探す
awk -F, '{print NR ": " NF " cols"}' data.csv | sort -u -k2 -n | head

# 列不足の行を抽出
awk -F, 'NF<5 {print NR": "$0}' data.csv

対処2: 列順を METHOD P で明示

入力ファイルとテーブル定義で列順が異なる場合は METHOD P で明示マッピング:

-- テーブル: (ID, NAME, EMAIL, AGE)
-- 入力CSV: NAME,EMAIL,AGE  (ID は省略 → DB2 が自動採番想定)

LOAD FROM data.csv OF DEL
  MODIFIED BY COLDEL,
  METHOD P (1,2,3)                     -- 入力の1,2,3列目を使う
  INSERT INTO MYSCHEMA.USERS (NAME, EMAIL, AGE)
  NONRECOVERABLE;
-- → ID は IDENTITY か DEFAULT で埋まる必要あり

-- 列の順序を入れ替え(CSV: EMAIL,NAME,AGE → テーブル: NAME,EMAIL,AGE)
LOAD FROM data.csv OF DEL
  MODIFIED BY COLDEL,
  METHOD P (2,1,3)                     -- 2列目=NAME, 1列目=EMAIL, 3列目=AGE
  INSERT INTO MYSCHEMA.USERS (NAME, EMAIL, AGE)
  NONRECOVERABLE;

対処3: 文字位置で指定(固定長ファイル)

固定長 (ASC) ファイルの場合は METHOD L で位置範囲指定:

LOAD FROM fixed.dat OF ASC
  METHOD L (1 10, 11 30, 31 80, 81 90)
  INSERT INTO MYSCHEMA.USERS (ID, NAME, EMAIL, AGE)
  NONRECOVERABLE;
-- 1-10桁=ID, 11-30桁=NAME, 31-80桁=EMAIL, 81-90桁=AGE

対処4: NULL を許容して取り込む

欠損行を NULL として通したい場合:

-- 該当列を ALTER で NOT NULL → NULLABLE に
ALTER TABLE MYSCHEMA.USERS ALTER COLUMN EMAIL DROP NOT NULL;

-- または COLUMN DEFAULT を設定
ALTER TABLE MYSCHEMA.USERS
  ALTER COLUMN EMAIL SET DEFAULT 'unknown@example.com';

-- LOAD 時は USEDEFAULTS で明示
LOAD FROM data.csv OF DEL
  MODIFIED BY COLDEL, USEDEFAULTS
  METHOD P (1,2,3,4)
  INSERT INTO MYSCHEMA.USERS;

拒否行の調査

SQL3100W が出ると、拒否行は exception/dump ファイルに残ります:

LOAD FROM data.csv OF DEL
  MODIFIED BY COLDEL,
  METHOD P (1,2,3,4)
  WARNINGCOUNT 1000               -- 警告 1000 件まで継続
  MESSAGES /tmp/load_msg.txt      -- ★ ログファイル
  DUMPFILE /tmp/dump.bin          -- ★ 拒否行を記録
  INSERT INTO MYSCHEMA.USERS;

-- 終了後ログを確認
-- cat /tmp/load_msg.txt | grep SQL3100W
-- → どの行・どの列が問題か特定できる

関連メッセージ

メッセージ意味
SQL3100W列が入力ファイルに不足
SQL3110NFROM 句のファイルが開けない
SQL3125W文字列が長すぎ、切詰めた
SQL3137Wカラム値が NULL だが NOT NULL 制約あり
SQL3185W前の行のエラーで拒否
SQL3550WIDENTITY 列の値がファイルにある(GENERATED ALWAYS)

よくあるトラブル

症状原因対処
全行 SQL3100W で拒否区切り文字違い(カンマ vs タブ)MODIFIED BY COLDEL, 明示
1 行目だけエラーヘッダ行混入MODIFIED BY SKIPCOUNT=1
VARCHAR 内に改行改行を行区切りと誤認CSV 整備 or DELPRIORITYCHAR
IDENTITY 列でエラーGENERATED ALWAYS で値指定MODIFIED BY IDENTITYIGNORE

FAQ

Q: 警告だけで完了したように見えるがデータが入っていない
A: SQL3185W で全行拒否されている可能性。SELECT COUNT(*) FROM target で実際の取り込み件数を確認し、MESSAGES / DUMPFILE オプションで拒否ログを取得してください。

Q: 大量の SQL3100W を抑止したい
A: 根本対応として CSV の整備が必要です。WARNINGCOUNT で停止閾値を変更すると暴走を防げます。

Q: PostgreSQL / MySQL でも同じ警告がある?
A: 番号は違いますが、NOT NULL 列に値が無い場合の警告は共通です。PostgreSQL COPY なら "null value in column violates not-null constraint"、MySQL LOAD DATA なら "Column 'x' cannot be null"。