So führen Sie eine Batch-Einfügung in MySQL durch

148

Ich habe 1 viele Datensätze, die in eine Tabelle eingegeben werden müssen. Was ist der beste Weg, dies in einer Abfrage zu tun? Sollte ich nur eine Schleife erstellen und einen Datensatz pro Iteration einfügen? Oder gibt es einen besseren Weg?

Genadinik
quelle
1
Bitte lesen Sie die Dokumentation für eine Anweisung oder Funktion, bevor Sie versuchen, sie zu verwenden. INSERTunterstützt dies nativ !
Leichtigkeitsrennen im Orbit
3
Wenn Sie über eine sehr große Anzahl von Datensätzen verfügen und diese als CSV-Datei formatieren können, lesen Sie die Anweisung LOAD DATA INFILE oder den Befehl mysqlimport.
Squawknull
Für den Datensatz ist LOAD DATA ein sehr flexibler Befehl, für den keine CSV-Eingabe erforderlich ist . Jedes Textformat reicht aus, und es gibt eine Reihe hilfreicher Parameter zum Parsen und Bearbeiten von Eingabedaten. Dies ist definitiv der schnellste Weg, um Daten in eine lokale Datenbank zu laden. Es ist nicht klar, was oben mit "am besten" gemeint ist: dh ob Einfachheit (INSERT-Anweisungen verwenden) Geschwindigkeit übertrifft (LOAD DATA verwenden).
EdwardGarson

Antworten:

298

Aus dem MySQL-Handbuch

INSERT-Anweisungen, die die VALUES-Syntax 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);
Nietaki
quelle
7
Ist dies langsamer als Load Data Infile?
Srchulo
Wie lautet die Syntax zum Schreiben dieser Anweisung insert in einer gespeicherten Prozedur?
Nitin Sawant
@Nitin wäre es nicht die gleiche Syntax .. ??? Das würde ich sowieso in SQL Server tun.
Anzeigen
13
Bitte beachten Sie, dass während der Frage markiert ist „How to do Batch diese Antwort Einsätze“ ist eigentlich Masseneinsatz. Bulk ist normalerweise schneller, siehe diese Frage
Mike Demenok
2
@Koffeehaus Per dieser SO-Antwort von @Lukman ist die Anzahl der Werte / Zeilen, die eingefügt werden können, begrenzt durchmax_allowed_packet
5.
22

Meistens arbeiten Sie nicht in einem MySQL-Client und sollten Batch-Einfügungen mithilfe der entsprechenden API zusammenfügen.

ZB in JDBC:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm

Kamran
quelle
5
Ein guter Blogeintrag über Batch-Einfügungen (in Java, aber für jede Sprache relevant): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur
6

Das Laden von Daten-Infile-Abfragen ist eine viel bessere Option, aber einige Server wie Godaddy beschränken diese Option auf Shared Hosting, sodass nur noch zwei Optionen übrig sind. Eine ist das Einfügen eines Datensatzes bei jeder Iteration oder Batch-Einfügung. Die Batch-Einfügung hat jedoch eine Beschränkung der Zeichen, wenn Ihre Abfrage diese überschreitet Anzahl der in MySQL festgelegten Zeichen, dann stürzt Ihre Abfrage ab. Ich schlage daher vor, Daten in Blöcken mit Batch-Einfügung einzufügen. Dadurch wird die Anzahl der mit database.best of glücklicher Jungs hergestellten Verbindungen minimiert

Syed Adeel Ali Rizvi
quelle
1
Wie wäre esLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j