VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
INSERT には好きなだけ行を載せられます。各行の括弧をカンマで区切り
ます。1 行につき 1 文を書くより入力量が少なく、サーバーへの往復も多数回では
なく 1 回で済みます。
これらの例では、INSERT の sakila_practice データベースを
使います。始める前にそこにあるセットアップブロックをもう一度実行し、次に
mysql -u root -p sakila_practice でクライアントを開いてください。
複数行 INSERT の仕組み
TABLE_NAME をテーブルに、COLUMN_LIST を値を与える列に、FIRST_ROW_VALUES
と SECOND_ROW_VALUES のそれぞれを、それらの列 1 つにつき 1 つの値に置き換え
ます。
列リストは 1 回だけ書き、すべての行に適用されます。各括弧は、その順番で値を
与えます。
例
- 1 文で 3 行
VALUES リストと、あらゆる
INSERT SELECT がこれに該当します。Records は
送った行数を、Duplicates は既に保存されている行と衝突した行数を、
Warnings はサーバーが調整しなければならなかったものを数えます。3 つの数字が
すべて送ったものと一致していれば、何も静かに変更されていないという印です。
1 つの不正な行が文全体を破棄させる
下の文は 3 行を載せています。真ん中の行は Mary Smith のアドレスを再利用して おり、email の UNIQUE インデックスがそれを拒否します。
INSERT IGNORE はエラーを警告に変える
INSERT IGNORE は保存できる行を保存し、残りをスキップします。
Records: 2 Duplicates: 1 は起きたことをそのまま報告しています。2 行を
差し出し、1 行が拒否されました。次に SHOW WARNINGS がそれを名指しし、同じ
ERROR 1062 のテキストが失敗ではなく警告として届きます。
IGNORE は、重複が本当に「既に持っている」という意味のときに使ってください。
それ以外では大雑把すぎる手段です。列に対して長すぎる値や、必須の列に値のない行を
含め、他のエラーも格下げしてしまうからです。INSERT IGNORE のたびに
SHOW WARNINGS を実行してください。そうしなければ、何が捨てられたか分かり
ません。既に保存されている行を更新するのが正しい答えである場合は、代わりに
upsert を使ってください。
まとめ
- 各行の括弧をカンマで区切り、列リストは 1 回だけ書きます。
Records、Duplicates、Warningsを読んで、何も調整されなかったことを確認します。- 1 行が拒否されると文全体が中止され、何も書き込まれません。
- 正常な行を保存するには
INSERT IGNOREを使い、その後でSHOW WARNINGSを読みます。 - 単一行の文を多数書くより、複数行の文を 1 つ書くほうを選びます。
関連項目
- INSERT — 単一行の形式と、それが起こすエラー
- INSERT SELECT — クエリから取り出した行
- Upsert — スキップする代わりに既存の行を更新する
- MySQL の一括挿入 — バッチサイズ、LOAD DATA、そして重要な設定