MySQLのLOAD DATA INFILEコマンドでテキスト・CSVファイルデータをインポート

Database データベース

MySQLは、LOAD DATA INFILEコマンドというもので、テキストファイルやCSVファイルのデータをインポートすることができる。

今回、LOAD DATA INFILEコマンドを使用するのは、PostgreSQLからMySQLへデータ移行するため。

PostgreSQLのpg_dumpコマンドで取得したバックアップファイル内のデータは、COPYコマンドを使用してタブ区切りのデータをインポートできるようにエクスポートされるが、MySQLにCOPYコマンドはなく、LOAD DATA INFILEコマンドを使用する必要があるようです。

なお、今回のバージョンは以下です。

  • Windows 10 Pro(64bit)
  • MySQL 5.5
スポンサーリンク

LOAD DATA INFILEコマンドの基本的な使い方

LOAD DATA INFILEコマンドの構文は以下のよう。

LOAD DATA INFILE "[データファイル]" INTO TABLE [テーブル名];

データファイルが先頭行なし、タブ区切り、フィールド囲み文字なし、改行コードCR+LF(\r\n)の場合、オプションは特に何もいらない。
それらをコマンドオプションで指定することができる。

データファイルをMySQLのdataフォルダに置いて実行することになるので、実行ユーザーにFILE権限を付与する必要がある。
データファイルを任意の場所に置いて実行する場合は、FILE権限は不要で、「LOAD DATA LOCAL INFILE」とすればOK。

実際のコマンドラインから実行するサンプルはこのような感じ。

--MySQL接続
>mysql -u test_user -ptest_password

>USE test_db;

>LOAD DATA LOCAL INFILE ".\\data\\test_data.txt" INTO TABLE test_table;

インポート時に警告などが出た場合は、SHOW WARNINGSコマンドで確認しよう。

PostgreSQLからMySQLへのデータ移行

PostgreSQLのpg_dumpコマンドで取得したバックアップファイル内のデータを使用し、MySQLのLOAD DATA INFILEコマンドを使用する場合、以下の項目でエラーとなった。

  • boolean型の項目
  • timestamp型の項目

まず、PostgreSQLでboolean型の項目は、データはt/f(true/false)の文字列で抽出されていたが、MySQLではtinyint型(1桁)となる。
なので、t/fを0/1へと置換してやる必要があった。

次に、PostgreSQLのtimestamp型の項目をMySQLのdatetime型の項目へと変換しようとしていたので、データの小数点以下の秒数を切り捨てた。

以上で、無事にインポートできました。

参考サイト

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.6 LOAD DATA INFILE 構文
LOAD DATA INFILE構文:データのインポート | Smart

コメント

  1. […] MySQLのLOAD DATA INFILEコマンドでテキスト・CSVファイルデータをインポート […]

タイトルとURLをコピーしました