ねこさんとへびさんの新人技術ブログ

新人エンジニアのねこさんとへびさんの、技術向上のためのブログです。

Tips!複数のデータを一括挿入したい - マルチプルインサート

マルチプルインサート - 複数のデータを一括挿入したい

uid user_name age
1 hebisan 10
2 nekosan 5


上記のUSERテーブルにデータを追加したい場合、インサート文を実行すると追加出来ます。

INSERT INTO user (uid, user_name, age) values (3, 'kaeru', 99);
INSERT INTO user (uid, user_name, age) values (4, 'inu', 55);

実行してみましょう。増えました。

uid user_name age
1 hebisan 10
2 nekosan 5
3 kaerukun 99
4 inukun 55


上記の方法、数件なら別に問題がないのですが、件数が多いと実行速度が遅くなる場合があります。
(特にトランザクションをはっている場合は顕著に遅くなります)
そこで1行のクエリで複数行のデータを挿入する方法。その名もマルチプルインサート!
valuesの次に入力したいデータの値を連ねていきます。

INSERT INTO user (uid, user_name, age) values (5, 'iruka', 21), (6, 'usami', 34), (7, 'nezukichi', 48), (8, 'hamuhamu', 48);

ではまた実行してみましょう。うん増えてます。

uid user_name age
1 hebisan 10
2 nekosan 5
3 kaerukun 99
4 inukun 55
5 iruka 21
6 usami 34
7 nezukichi 48
8 hamuhamu 48

COMMITや、通常INSERT文が実行される過程で付属的に行われる処理が一度で済むため早くなるようです。
ただ無制限に登録できるわけではありません。
MySQLのクエリの長さには上限があります。
ので実装する時はエラー制御しておいたほうがいいですね。

上限の確認

show variables like 'max_allowed_packet';

上記のクエリを実行してみましょう。

Variable_name Value
max_allowed_packet 1048576

私の環境では1M(デフォルト)であることが判りました。

上限の変更
上限をするにはmy.cnfファイルを編集してMySQLを再起動します。
my.cnf

max_allowed_packet=16MB

(byへびさん)

参考
MySQL :: MySQL 5.6 リファレンスマニュアル :: B.5.2.10 パケットが大きすぎます