動かざることバグの如し

近づきたいよ 君の理想に

CSVファイルからMySQLへデータをインポート

こんなコマンドあったんだ てっきりcsv読み込んでforeachやるしかないって思ってた

CSVファイルを用意

例えばこんなやつ

100,hoge,hogetaro@gmail.com
101,piyo,piyoko@yahoo.com.jp
102,fuga,huganosuke@hotmail.com

このCSVを仮に/tmp/test.csvに配置する

tableの作成

create table fromcsv(id int primary key auto_increment, num int not null, name varchar(100) not null, email varchar(100) not null);

以下のようになるはず

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| num   | int(11)      | YES  |     | NULL    |                |
| name  | varchar(100) | NO   |     | NULL    |                |
| email | varchar(100) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

idはCSVに元々ないけど便宜上用意する(別に無くても動作はする)

読み込む

LOAD DATA LOCAL INFILE "/home/user/test.csv" INTO TABLE `fromcsv` FIELDS TERMINATED BY ',' (num, name, email);
  • INTO TABLE `fromcsv` 出力先のtable名を指定
  • FIELDS TERMINATED BY ',' CSVがどの文字列で区切られているか(デフォルトは\t)
  • (num, name, email) 出力先テーブルのどのコラムに格納するか 今回はid不要なためそれ以外を記述

エラーの確認

多少は出る

SHOW warnings;

確認

うまくいけば以下のようになっているはず

mysql> select * from fromcsv;
+----+-----+------+------------------------+
| id | num | name | email                  |
+----+-----+------+------------------------+
|  1 | 100 | hoge | hogetaro@gmail.com     |
|  2 | 101 | piyo | piyoko@yahoo.com.jp    |
|  3 | 102 | fuga | huganosuke@hotmail.com |
+----+-----+------+------------------------+

データが崩れて入る場合

たいていWindowsのせい

The used command is not allowed with this MySQL versionって怒られる

ここ参照

mysql --local-infile -u root -p

で通った