MySQLに複数の行を挿入する


349

一度に複数の行を挿入すると、データベースのクエリが速くなりますか?

お気に入り

INSERT....

UNION

INSERT....

UNION

(私は2〜3000行のように挿入する必要があります)


8
UNIONはセレクト用です。
ジェイコブ、

1
行はどうなっていますか?MySQLクエリブラウザーでSQLを直接記述していますか、それともPHPやC#などの内部から使用していますか?後者のケースに当てはまる場合は、次のリンクを確認してください。100kレコードを挿入する最も速い方法は 、複数行の高速挿入
RKh

回答:


1176

INSERTVALUES構文を使用するステートメントは、複数の行を挿入できます。これを行うには、列値の複数のリストを含め、それぞれを括弧で囲み、コンマで区切ります。

例:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

ソース


@RPK。私はあなたに同意しますが、彼女のデータソースを知りません。私がすでに書いたように、彼女がファイルを持っている場合、私はculisが示唆するようにデータのロード構文を使用します。:)
ニコラ・コス

を使用することもできますINSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3。もちろん、これは挿入された値が異なるテーブルからのものである場合にのみ優れています。
Zohar Peled

72
時々私は単純な構文を忘れてしまうので参考になります。
ハイパーテキストキャプテン2015

a、b、cは、行の内容を格納する一時変数ですか?
Lealo

3
@Lealoいいえ、同じ順序で値を挿入するためのテーブル列名です。
BeetleJuice 2017

60

テキストファイルにデータがある場合は、LOAD DATA INFILEを使用できます。

テキストファイルからテーブルをロードする場合は、LOAD DATA INFILEを使用します。これは通常、INSERTステートメントを使用するよりも20倍高速です。

INSERTステートメントの最適化

上記のリンクで、挿入ステートメントを高速化する方法に関するヒントを見つけることができます。


3
重複したレコードはどうですか?
Matteo

2
@Matteo Duplicatesは、定義したスキーマに基づいてデータベースによって挿入または拒否されます。
ankush981 2015

mysqlマルチクエリを使用する
Francisco Yepes Barrera

1
2番目のリンク
404。– dimir

1
壊れたリンク「挿入ステートメントの速度」は、「INSERTステートメントの最適化」で説明されています。
ケネスM.コラノ2017年

27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;

3
これはより多くの投票に値し、これを使用して他のテーブルから取得したデータを一括挿入できます
Novastorm

4
「他のテーブルから取得されたデータを一括挿入する」必要があることを考えると、このコード部分で何が起こっているかについての説明しかなかった場合...
Aleister Tanek Javas Mraz

0

これは、次のようなPHPソリューションで、:m(多対多の関係)テーブルで使用できます。

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));

implode()を使用しても「最後の文字」の問題は回避されますが、メモリオーバーヘッドが非常に大きくなります。彼女は3000行を要求しました。各行に1kbのデータがあると想像してください。これはすでに3MBの生データです。配列は、彼女がすでに$ table_1から別の30MBを消費している30MBのメモリを占有するため、スクリプトは60MBを使用します。ただ言うなら、そうでなければそれは良い解決策です
ジョン

それは私の状況に役立ちます。
ビラルシムチェク

-11
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";

この応答の混乱のほかに、PHPを使用している場合、SQLインジェクションに対して脆弱になる可能性もあります。
ultrafez 2018年

2
1. SQLコードにバグがあります。2.次の$ sql値は、前の$ sql値を置き換えます。
Marwan Salim、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.