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 」のワーニングが出た場合、
最後のカラムのデータを疑ってみると良いのかも。