メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
1 つの 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. 1 文で 3 行

2 行目は、文が 2 行以上を書き込みうるときに常に表示されます。複数行の VALUES リストと、あらゆる INSERT SELECT がこれに該当します。Records は 送った行数を、Duplicates は既に保存されている行と衝突した行数を、 Warnings はサーバーが調整しなければならなかったものを数えます。3 つの数字が すべて送ったものと一致していれば、何も静かに変更されていないという印です。
id は行が書かれた順に続いています。

1 つの不正な行が文全体を破棄させる

下の文は 3 行を載せています。真ん中の行は Mary Smith のアドレスを再利用して おり、email の UNIQUE インデックスがそれを拒否します。
他の 2 行も保存されませんでした。
1 つの文は全か無かなので、1 つの不正な値を含む 10,000 行のバッチは何も 書き込みません。全か無かということは、大きなバッチは送信前にデータを 確認しておく必要があるということでもあります。サーバーは問題のある行を 1 つ名指しして止まるからです。

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、そして重要な設定