MySQLでファイルのデータをテーブルに挿入する

  • 10
    いいね
  • 0
    コメント

MySQLでのファイルからのデータ挿入方法について。
バージョン5.7.11でmysqlクライアントを使用して確認しています。

LOAD DATA INFILE

LOAD DATA INFILE を使用してファイルをテーブルに登録することができます。

構文

サーバ上のファイルを使用する場合

LOAD DATA INFILE 'ファイル名' INTO TABLE テーブル名

ローカルファイルを使用する場合

LOAD DATA LOCAL INFILE 'ファイル名' INTO TABLE テーブル名

mysql> system sudo cat /var/lib/mysql-files/test.tsv;
1   isono
2   fuguta

mysql> SELECT * FROM test;
Empty set (0.00 sec)

mysql> LOAD DATA INFILE '/var/lib/mysql-files/test.tsv' INTO TABLE test;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | isono  |
|    2 | fuguta |
+------+--------+
2 rows in set (0.00 sec)

secure_file_priv

LOCALオプションを使用せずにサーバ上のファイルを使用する場合で、サーバオプションのsecure_file_privが設定されている場合には、設定されたディレクトリ以外からの入力はエラーになります。

mysql> SELECT @@secure_file_priv
    -> ;
+-----------------------+
| @@secure_file_priv    |
+-----------------------+
| /var/lib/mysql-files/ |
+-----------------------+
1 row in set (0.00 sec)

mysql> LOAD DATA INFILE '/tmp/test.tsv' INTO TABLE test;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

FIELDSオプションとLINESオプション

先の例では区切り文字はタブで認識されています。
FIELDSオプションを使用すれば区切り文字を、LINESオプションを使用すれば改行コードを修正できます。

mysql> system sudo cat /var/lib/mysql-files/test.csv;
1,"磯野"
2,"フグ田"

mysql> SELECT * FROM test;
Empty set (0.00 sec)

mysql> LOAD DATA INFILE '/var/lib/mysql-files/test.csv' INTO TABLE test
    -> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"'
    -> LINES TERMINATED BY '\r\n';
Query OK, 2 rows affected (0.01 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM test;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 磯野      |
|    2 | フグ田    |
+------+-----------+
2 rows in set (0.00 sec)