MySQL - Wie viele Zeilen kann ich in eine einzelne INSERT-Anweisung einfügen?

86

Kommt es auf die Anzahl der Wertesätze an? Kommt es auf die Anzahl der Bytes in der INSERT-Anweisung an?

Luistar15
quelle

Antworten:

90

Sie können unendlich viele Datensätze mithilfe von INSERT ... SELECTMustern einfügen , sofern Sie diese Datensätze oder einen Teil davon in anderen Tabellen haben.

Wenn Sie die Werte jedoch mithilfe von INSERT ... VALUESMustern fest codieren , gibt es eine Begrenzung für die Größe / Länge Ihrer Anweisung: max_allowed_packet, wodurch die Länge der vom Client an den Datenbankserver gesendeten SQL-Anweisungen begrenzt wird und alle Arten von Abfragen betroffen sind und nicht nur für die INSERT-Anweisung.

Lukman
quelle
43

Im Idealfall ermöglicht MySQL die Erstellung einer unendlichen Anzahl von Zeilen in einer einzelnen Einfügung (auf einmal), jedoch wenn a

Der MySQL-Client oder der mysqld-Server empfängt ein Paket, das größer als max_allowed_packet ist, gibt einen zu großen Paketfehler aus und schließt die Verbindung.

Führen Sie den folgenden Befehl in MySQL aus, um den Standardwert für die Variable max_allowed_packet anzuzeigen:

show variables like 'max_allowed_packet';

Die Standard-MySQL-Installation hat einen Standardwert von 1048576 Byte (1 MB). Dies kann erhöht werden, indem ein höherer Wert für eine Sitzung oder Verbindung festgelegt wird.

Dies setzt den Wert für alle auf 500 MB (das bedeutet GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

Überprüfen Sie Ihre Änderung im neuen Terminal mit neuer Verbindung:

show variables like 'max_allowed_packet';

Jetzt sollte es ohne Fehler für das Einfügen von unendlichen Datensätzen funktionieren. Vielen Dank

Raju Akula
quelle
11
500 MB sind nicht unendlich. Es ist viel größer als der Standardwert, aber immer noch nicht unendlich.
Carlos2W
Eine Frage: Wofür genau ist diese Grenze? Die Abfrage selbst? Was ist mit den Daten, die beim Ausführen der Anweisung gebunden werden? Kann ich bis dahin sicher sein strlen($query_with_questionmarks) < $max_alloweed_packet?
Pilat
22

Die Abfrage ist max_allowed_packetim Allgemeinen begrenzt durch .

Dmytro Lytovchenko
quelle
5

Sie können mit einer INSERT-Anweisung unendlich viele Zeilen einfügen. Sie können beispielsweise eine gespeicherte Prozedur ausführen, bei der eine Schleife tausendmal ausgeführt wird, wenn eine INSERT-Abfrage ausgeführt wird.

Oder Ihr INSERT könnte einen Trigger auslösen, der selbst ein INSERT ausführt. Welches löst einen anderen Auslöser aus. Und so weiter.

Nein, es hängt nicht von der Anzahl der Wertesätze ab. Es hängt auch nicht von der Anzahl der Bytes ab.

Es gibt eine Begrenzung dafür, wie tief Ihre Klammern verschachtelt sein können, und eine Begrenzung dafür, wie lang Ihre Gesamtanweisung ist. Auf beide wird ironischerweise auf thedailywtf.com verwiesen. Beide oben genannten Mittel umgehen jedoch diese Grenzen.

Borealid
quelle
Ihre Beispiele sind für die Ausführung mehrerer INSERT, und es wird nicht über das Einfügen mehrerer Zeilen in eine INSERT-Anweisung gezeigt.
Lukman
@ Lukman: Eine INSERT-Abfrage kann dazu führen, dass mehrere INSERTS in die Datenbank gelangen. Es geht nur darum, wer was zählt.
Borealid
2
Das stimmt, aber Ihr erstes Beispiel zeigt, wie eine Abfrage in einer Schleife ausgeführt wird, wobei jede Schleife eine INSERT-Anweisung ausführt, und es sagt nichts über diese eine INSERT-Anweisung aus, die mehrere Zeilen einfügt. es ist nur eine Frage der Betonung.
Lukman
Niemand kann unendlich viel tun. Es gibt immer Ressourcenbeschränkungen.
Adrien
Gilt dies auch für die Anweisung SELECT ... FROM? Ich meine, wenn Daten zuerst mit max_allowed_packet eingefügt wurden, sollte dies nicht auch danach ausgewählt werden? Ich verstehe nicht, warum es auf alle anderen Aussagen angewendet wird, wie das andere Poster sagte, als es zuerst vor irgendetwas anderem eingefügt werden muss.
Thielicious
1

Ich glaube, es gibt keine definierte Anzahl von Zeilen, die Sie pro INSERT einfügen dürfen, aber es kann eine Art maximale Größe für Abfragen im Allgemeinen geben.

DMags
quelle
1

Es ist durch max_allowed_packet begrenzt.
Sie können Folgendes angeben: mysqld --max_allowed_packet=32M Es ist standardmäßig 16M.
Sie können auch in my.cnf in / etc / mysql / angeben

linehrr
quelle