mariadb の doesn't contain data for all columns 解消する






mariadb で、TSV を使ってデータをインポートした際に、

doesn't contain data for all columns のワーニングが出た際に、

解消した方法は以下の通り。

ワーニングの文言でちょっとミスリードされるので、

同じ原因じゃない場合でも、原因調査の参考になると思います。

まずデータベース「 testdb 」を作成。

> create database `testdb`;

次に、テーブル「 test_tbl 」を作成。

> create table `testdb`.`test_tbl` (
 `Name` varchar(50) default null,
 `age` int default null,
 `Organization` varchar(50) default null,
 `No` int default null auto_increment primary key,
 key `Name` (`Name`)
) engine=InnoDB default charset=utf8;

インポートする TSV 「 /tmp/test.txt 」を作成。

TAB区切り、CRLF 改行、文字コード UTF-8

Test Taro	30	System Development Unit
New Jiro	20	System Development Unit
Old Saburo	50	System Development Unit

作成した TSV ファイルのデータを mariadb へインポートする。

> use testdb;

[testdb]> LOAD DATA LOCAL INFILE '/tmp/test.txt' INTO TABLE test_tbl fields terminated by '\t' optionally enclosed by '"' escaped by '\\' lines terminated by '\r\n';

この時の実行結果は以下の通り。

[testdb]> LOAD DATA LOCAL INFILE '/tmp/test.txt' INTO TABLE test_tbl fields terminated by '\t' optionally enclosed by '"' escaped by '\\' lines terminated by '\r\n';
Query OK, 3 rows affected, 3 warnings (0.001 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 3

3 件のワーニングが出ているので内容を確認してみる。

[testdb]> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1261 | Row 1 doesn't contain data for all columns |
| Warning | 1261 | Row 2 doesn't contain data for all columns |
| Warning | 1261 | Row 3 doesn't contain data for all columns |
+---------+------+--------------------------------------------+
3 rows in set (0.000 sec)

1 〜 3 行目で全てのカラムにデータが含まれていないということ。

しかし、ワーニングが出力されてもデータはちゃんとインポートされている。

改行コードがおかしくて、空行のように認識されている?

改行コードもCRLFで一致しているので問題無い。

インクリメントの使い方がおかしい?

インクリメントもちゃんと動作している。

このワーニングは何に対するワーニング何だろう?

ネットで調べても明確な理由は特定できなかったが、

ある行の最終カラムのデータを修正したら解消したような情報があったのでピンときた。

インポートするデータ「 /tmp/test.txt 」を以下のように修正。
TAB区切り、CRLF 改行、文字コード UTF-8

「 No 」のカラムに初期値として「 0 」をセット。

Test Taro	30	System Development Unit 0
New Jiro	20	System Development Unit	0
Old Saburo	50	System Development Unit	0

このデータを使って、再度インポートした時の実行結果は以下の通り。

[testdb]> LOAD DATA LOCAL INFILE '/tmp/test.txt' INTO TABLE test_tbl fields terminated by '\t' optionally enclosed by '"' escaped by '\\' lines terminated by '\r\n';
Query OK, 3 rows affected (0.001 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

無事ワーニングが解消。

インクリメントもちゃんと動作している。

[testdb]> select * from test_tbl;
+--------------+------+-------------------------+----+
| Name         | age  | Organization            | No |
+--------------+------+-------------------------+----+
| Test Taro    |   30 | System Development Unit |  1 |
| New Jiro     |   20 | System Development Unit |  2 |
| Old Saburo   |   50 | System Development Unit |  3 |
+--------------+------+-------------------------+----+
3 rows in set (0.000 sec)

それにしても、分かりにくいワーニングだ。。。

「 doesn't contain data for all columns 」のワーニングが出た場合、

最後のカラムのデータを疑ってみると良いのかも。