Einfügen mehrerer Zeilen in MySQL


349

Ist die Datenbankabfrage schneller, wenn ich mehrere Zeilen gleichzeitig einfüge:

mögen

INSERT....

UNION

INSERT....

UNION

(Ich muss wie 2-3000 Zeilen einfügen)


8
UNION ist für ausgewählte Personen.
Jacob

1
Wie kommen die Reihen? Schreiben Sie SQL direkt in MySQL Query Browser oder verwenden Sie PHP oder C # oder etwas anderes? Wenn Sie in den letzteren Fall passen, überprüfen Sie die folgenden Links: Der schnellste Weg zum Einfügen von 100.000 Datensätzen Schnelle Einfügungen mit mehreren Zeilen
RKh

Antworten:


1176

INSERTAnweisungen, die VALUESSyntax verwenden, können mehrere Zeilen einfügen. Fügen Sie dazu mehrere Listen mit Spaltenwerten hinzu, die jeweils in Klammern stehen und durch Kommas getrennt sind.

Beispiel:

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

Quelle


@RPK. Ich stimme Ihnen zu, aber ich kenne ihre Datenquelle nicht. Wie ich bereits schrieb, würde ich, wenn sie eine Datei hat, die Syntax zum Laden von Daten verwenden, wie Cularis vorschlägt. :)
Nicola Cossu

es ist auch möglich zu verwenden INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. Dies ist natürlich nur besser, wenn die eingefügten Werte aus verschiedenen Tabellen stammen.
Zohar Peled

72
Hilfreiche Referenz, weil ich manchmal einfach die einfache Syntax vergesse.
Kapitän Hypertext

Speichern a, b und c hier temporäre Variablen, die den Inhalt der Zeilen speichern?
Lealo

3
@Lealo nein, dies sind die Tabellenspaltennamen, in die die Werte in derselben Reihenfolge eingefügt werden sollen.
BeetleJuice

60

Wenn Sie Ihre Daten in einer Textdatei haben, können Sie LOAD DATA INFILE verwenden .

Verwenden Sie beim Laden einer Tabelle aus einer Textdatei LOAD DATA INFILE. Dies ist normalerweise 20-mal schneller als die Verwendung von INSERT-Anweisungen.

INSERT-Anweisungen optimieren

Weitere Tipps zum Beschleunigen Ihrer Einfügeanweisungen finden Sie unter dem obigen Link.


3
Was ist mit doppelten Datensätzen?
Matteo

2
@ Matto-Duplikate werden von der Datenbank basierend auf dem von Ihnen definierten Schema entweder eingefügt oder abgelehnt.
ankush981

Verwenden Sie MySQL-Multiqueries
Francisco Yepes Barrera

1
Zweiter Link 404.
Dimir

1
Der defekte Link "Geschwindigkeit der Einfügeanweisungen" wird jetzt behandelt in: Optimieren von INSERT-Anweisungen .
Kenneth M. Kolano

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
Dies verdient mehr Upvotes. Mit dieser Option können Sie Daten, die aus anderen Tabellen abgerufen wurden, per Masseneinfügung einfügen
Novastorm

4
Wenn es nur eine Erklärung dafür gäbe, was in diesem Code passiert, da ich "Daten aus anderen Tabellen in Massen einfügen muss" ...
Aleister Tanek Javas Mraz

0

Hier ist eine PHP-Lösung, die mit einer: m-Tabelle (Viele-zu-Viele-Beziehung) verwendet werden kann:

// 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));

Die Verwendung von implode () umgeht zwar das Problem des "letzten Zeichens", verursacht jedoch einen enormen Speicheraufwand. Sie bat um 3000 Zeilen. Stellen Sie sich vor, jede Zeile enthält 1 KB Daten, das sind bereits 3 MB Rohdaten. Das Array belegt 30 MB Speicher, den sie bereits für weitere 30 MB aus $ table_1 verbraucht, sodass das Skript 60 MB verwenden würde. Nur sagen, sonst ist es eine gute Lösung
John

es ist nützlich für meine Situation.
Bilal Şimşek

-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')";

Abgesehen von der Verwirrung dieser Antwort sind Sie möglicherweise auch anfällig für SQL-Injection, vorausgesetzt, Sie verwenden PHP.
Ultrafez

2
1. Ihr SQL-Code enthält einen Fehler. 2. Der nächste $ sql-Wert ersetzt den vorherigen $ sql-Wert.
Marwan Salim
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.