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へびさん)