1
0

More than 1 year has passed since last update.

MySQLで大量データを一括格納する方法: Bulk InsertとLOAD DATAの使用例

Posted at

こんにちは。
データベースの学習に入り、はや2週間が経とうとしています。
最近のハイライトはサンプルデータを使ってあれやこれやMySQLの練習をしようと思ったら、テーブル設計にミスがあるのが発覚し、一から作り直す羽目になったことです。どうもjunpei314です。

はじめに

データベース設計の勉強をしている際に、テーブルを作成できたはいいものの、大量のサンプルデータを格納するにはどうすればいいのだろうと思い色々と調べてみました。
今回は、大量のデータをテーブルに格納する方法をまとめてみます。

実行環境

MacBook Air (M1)
MySQL8.0

サンプルデータ

以下のサンプルデータを使用する

prefectures

id name
1 北海道
2 青森県
3 岩手県
-- -----
46 鹿児島県
47 沖縄県

1.一括で格納する(Bulk Insert)

下記の様に記述することで省略してデータを格納できる

INSERT INTO table_name (id, name)
VALUES
    (1, '北海道'),
    (2, '青森県'),
    (3, '岩手県'),
    -------------
    (46, '鹿児島県'),
    (47, '沖縄県');

2.テキストファイルを直接テーブルにロードする

2-1. LOAD DATAを使う

LOAD DATA LOCAL INFILE 'ファイルパス'
INTO TABLE prefectures
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n'
(id, name);

COLUMNS TERMINATED BY ','
入力ファイル内の各カラム(列)がどの文字で区切られているかを指定する
LINES TERMINATED BY '\n'
入力ファイル内の各行がどの文字で区切られているかを指定する

下記のエラーが出ることがある
mysqlimport: Error: 3948, 
Loading local data is disabled; 
this must be enabled on both the client and server sides, 
when using table: programs

MySQLサーバがローカルデータのロードを許可していないために発生している模様
以下のコードで設定ファイルのステータスを確認する

SELECT @@local_infile;

データロードの設定がオフの場合は以下の様に出力される

出力結果
+----------------+
| @@local_infile |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

以下のコードを実行しデータをロードできるようにする

SET GLOBAL local_infile=on;
出力結果
+----------------+
| @@local_infile |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

再度、LOAD DATA LOCAL INFILE を実行する

2-2. mysqlimportを使う

mysqlimport -u ユーザー名 -p --local データベース名 ファイル名

注意点
  • mysqlimportは指定したファイル名からテーブル名を推測するため、ファイル名はテーブル名と同じものにする必要がある
    • prefecturesテーブルにテキストファイル内のデータを格納する場合は、あらかじめprefectures.tsvなどの様にしておく
  • デフォルトではタブで列を、改行で行を区切るため、特にオプションで指定しない場合はtsvファイルにする必要がある
    • カンマで列を区切る場合は--fields-terminated-by=','を追記する
  • ファイル名を複数設定することで一度に複数のファイルをロードすることができる

まとめ

今回は効率的にデータをテーブルに格納する方法をまとめました。
SQLスクリプト内でデータのロードを行いたい場合や、他のSQLクエリと組み合わせてデータのロードを行いたい場合は、LOAD DATA LOCAL INFILEを使用してみてください。
また、シェルスクリプトからデータのロードを行いたい場合、または複数のファイルを一度にインポートしたい場合は、mysqlimportを使用してみてください。

参考URL

LOAD DATA INFILEの使い方(実践編)

[MySQL] テーブルにファイルをインポートする – mysqlimport編

MySQL8でインポート・エクスポート

MySQL 8.0 リファレンスマニュアル LOAD DATA ステートメント

MySQL 8.0 リファレンスマニュアル INSERT ステートメント

MySQL 8.0 リファレンスマニュアル mysqlimport — データインポートプログラム

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0