CSVファイルをMySQLにインポートするSQL文
はじめに
CSVファイルをMySQLにインポートするSQL文をよく使うのでこのSQL文についてメモします。
やりたいこと
以下のようなCSVファイルがあるとし、これらデータをMySQLの指定したテーブルにインポートします。
上記CSVファイルは、見て分かるとおり以下のカラムを以下の通りの順番で含んでいます。
- ID
- lastkana(姓フリガナ)
- firstkana(名フリガナ)
- lastname(姓)
- firstname(名)
- brithday(誕生日)
- email(メールアドレス)
- tel(電話番号)
前提と環境
以下の環境となります。
- OS : Ubuntu 18.04
- MySQL:5.7.27, for Linux (x86_64)
CSVファイルをMySQLにインポートするSQL文
基本的なSQL文としては以下になります。
mysql> load data local infile "/home/myuser/my.csv " into table mytable fields terminated by ',' optionally enclosed by '"';
/home/myuser/my.csv
がCSVファイルの絶対パスになります。また、mytable
がインポート先となるテーブル名です。
なお、CSVファイルの先頭行はカラム名が入っており、上記SQL文を発行すると先頭行もデータとしてインポートされます。また、CSVファイルのカラム順がそのままMySQL側のテーブルのカラム順通りにインポートされます。したがって、もしインポート先であるmytable
のカラムが以下のような場合、
mysql> show columns from mytable;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| firstname | varchar(255) | YES | | NULL | |
| lastname | varchar(255) | YES | | NULL | |
| firstkana | varchar(255) | YES | | NULL | |
| lastkana | varchar(255) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| email | varchar(255) | YES | | NULL | |
| tel | varchar(255) | YES | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
CSVファイルのカラム順と異なるため、CSVファイルのlastkana
はmytable
のfirstname
にインポートされるため注意が必要です。これらの解決方法について以降で説明します。
CSVファイルの先頭行を無視する
以下のようにignore 1 lines
を使用します。
mysql> load data local infile "/home/myuser/my.csv " into table mytable fields terminated by ',' optionally enclosed by '"' ignore 1 lines;
CSVファイルのカラムとMySQLテーブルのカラムを対応させる
以下のように、CSVファイル側のカラムを任意の変数に割り当てて、それをMySQL側のカラムに対応させることで可能です。以下の@id
、@firstname
等が変数名です。set
句を使ってこの変数とMySQLテーブルのカラム名を対応付けています。
mysql> load data local infile "/home/myuser/my.csv " into table mytable fields terminated by ',' optionally enclosed by '"' ignore 1 lines
(@id,@lastkana,@firstkana,@lastname,@firstname,@birthday,@email,@tel)
set id = @id,
firstname = @firstname,
lastname = @lastname,
firstkana = @firstkana,
lastkana = @lastkana,
birthday = @birthday,
email = @email,
tel = @tel;
なお、変数名は上記のように具体的な名前にせずに、以下のようにCSVファイル側のカラム番号でも指定できます。
mysql> load data local infile "/home/myuser/my.csv" into table students fields terminated by ',' optionally enclosed by '"'
ignore 1 lines
(@1,@2,@3,@4,@5,@6,@7,@8)
set id = @1,
firstname = @5,
lastname = @4,
firstkana = @3,
lastkana = @2,
birthday = @6,
email = @7,
tel = @8;
まとめ
古いシステムに含まれるデータをCSV形式で書き出して新しいシステムに移行するような機会が多く、よく使うのでまとめてみました。
関連記事
- 公開日:2020/01/20 更新日:2020/01/20
MySQLでrootのパスワードを忘れたりログインできなくなった場合の対処方法
MySQLのrootのパスワードを忘れてしまいrootでログインできなくなってしまいましたが、rootのパスワードを再設定することができたのでその手順をまとめます。
- 公開日:2019/05/27 更新日:2019/05/27
Ubuntu18.04にMySQLをインストールする手順
UbuntuにMySQLサーバをインストールする機会が何かと多く、MySQL5.7以降で少々設定が変わっていたのでインストールと設定手順をまとめます。
- 公開日:2019/04/19 更新日:2019/04/19
MySQL Workbenchでエクスポート時にmysqldump Version Mismatchが出る場合の解決策
リモートサーバ上のMySQLデータベースの中身をちょっと確認したい時にMySQL Workbenchを使用しています。SSH経由での接続ももちろん可能で特に不満なく使えます。ただ、エクスポートする際に警告が表示されて解決に少しだけ時間かかってしまったので原因と解決手順をメモします。
- 公開日:2015/03/16 更新日:2015/03/16
Ruby on RailsでMySQLを使用する際に必要な作業手順
RailsではデータベースとしてSQLite3をデフォルトで使用しますが、SQLite3ではなくMySQLを使用したかったので、RailsでMySQLを使用するために行った作業をメモしておきます。