Come eseguire un inserimento batch in MySQL


148

Ho 1-numero di record che devono essere inseriti in una tabella. Qual è il modo migliore per farlo in una query? Devo solo fare un ciclo e inserire un record per iterazione? O c'è un modo migliore?


1
Leggere la documentazione per un'istruzione o una funzione prima di tentare di utilizzarla. INSERTsupporta questo nativamente !
Razze di leggerezza in orbita

3
Se hai un numero davvero elevato di record e puoi formattarli come file CSV, controlla l'istruzione LOAD DATA INFILE o il comando mysqlimport.
squawknull,

Per la cronaca, LOAD DATA è un comando molto flessibile che non richiede input CSV; qualsiasi formato di testo funzionerà e sono disponibili numerosi parametri utili per l'analisi e la manipolazione dei dati di input. Questo è sicuramente il modo più veloce per caricare i dati in un db locale. Non è chiaro cosa si intenda per "migliore" sopra: ovvero se la semplicità (utilizzare le istruzioni INSERT) supera la velocità (utilizzare LOAD DATA).
EdwardGarson,

Risposte:


298

Dal manuale di MySQL

Le istruzioni INSERT che utilizzano la sintassi VALUES possono inserire più righe. Per fare ciò, includere più elenchi di valori di colonna, ciascuno racchiuso tra parentesi e separato da virgole. Esempio:

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

7
È più lento di Load Data Infile?
srchulo,

qual è la sintassi per scrivere questa istruzione insert nella stored procedure?
Nitin Sawant,

@Nitin non sarebbe la stessa sintassi .. ??? Questo è quello che farei comunque in SQL Server.
Annunci

13
Si noti che mentre la domanda è etichettata "Come eseguire inserimenti batch ", questa risposta è in realtà l' inserimento di massa . La massa è di solito più veloce, vedi questa domanda
Mike Demenok,

2
@Koffeehaus Per questa risposta SO di @Lukman, il numero di valori / righe che è possibile inserire è limitato damax_allowed_packet
Sepster

22

Il più delle volte, non stai lavorando in un client MySQL e dovresti inserire in batch inserimenti usando l'API appropriata.

Ad esempio 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


5
Un buon post sul blog sugli inserimenti batch (in Java, ma è rilevante per qualsiasi lingua): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

Carica query di data infile è un'opzione molto migliore ma alcuni server come godaddy limitano questa opzione sull'hosting condiviso, quindi, rimangono solo due opzioni quindi una è inserire record su ogni iterazione o inserimento batch, ma l'inserimento batch ha il suo limite di caratteri se la tua query supera questa numero di caratteri impostati in mysql, quindi la tua query si arresterà in modo anomalo, quindi ti suggerisco di inserire i dati in blocchi con l'inserimento batch, questo ridurrà al minimo il numero di connessioni stabilite con database. buona fortuna ragazzi


1
Che ne diciLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.