MySQL load dataでcsvをインサートする

かなり高速でinsertしてくれます。

使い方

MySQLにログインして、データベースを指定して実行します。

mysql> use [データベース]
mysql> load data local 
infile '/xxx/test.csv' 
into table [テーブル名] 
fields terminated by ',' 
enclosed by '"' 
lines terminated by '\n';

ERROR 1045

ERROR 1045 (28000): Access denied for user ‘test’@’localhost’ (using password: YES)
の場合はmysqlのユーザーにファイル権限がありません。

のようなエラーがでる場合があります。

①MySQLのファイル権限を確認します。(linuxではありません)

mysql> select user,file_priv from mysql.user;
+--------+-----------+
| user   | file_priv |
+--------+-----------+
| root   | Y         |
| test   | N         |
+--------+-----------+
2 rows in set (0.00 sec)
もしなければ追加します。
mysql> grant file on *.* to test@localhost;
Query OK, 0 rows affected (0.00 sec)

②linuxのディレクトリとファイルのアクセス権限を確認します

#chmod 755 test.csv
だめらならファイルの入っているディレクトリにも
#chmod 755 dir

③ローカルキーワードの確認
データベースサーバー上にcsvファイルがある場合でもlocalキーワードが必用です。
mysql> load data local infile ‘/xxx/test.csv’ into table [テーブル名] fields terminated by ‘,’ enclosed by ‘”‘ lines terminated by ‘\n’;

成功したら下記のように表示されるはずです。

mysql> use [データベース]
mysql> load data local infile '/xxx/test.csv' into table soumu fields terminated by ',' enclosed by '"' lines terminated by '\n';
Query OK, 1800 rows affected (0.04 sec)
Records: 1800  Deleted: 0  Skipped: 0  Warnings: 0

データは追加されていくので、同じファイルを何度もインポートしていると、キーが重複してSkippedが発生するかもしれません。

[補足]insertを高速にする

複数のinsert分をまとめることで早くなります。

mysql>INSERT INTO table (id,name) VALUES(1,'本'),(2,'たまご'),(3,'猫');
タイトルとURLをコピーしました