Cómo hacer una inserción por lotes en MySQL

148

Tengo 1-muchos número de registros que deben ingresarse en una tabla. ¿Cuál es la mejor manera de hacer esto en una consulta? ¿Debo hacer un bucle e insertar un registro por iteración? ¿O hay un mejor camino?

Genadinik
fuente
1
Lea la documentación de una declaración o función antes de intentar usarla. INSERTapoya esto de forma nativa !
Carreras de ligereza en órbita el
3
Si tiene una gran cantidad de registros y podría formatearlos como un archivo CSV, consulte la instrucción LOAD DATA INFILE o el comando mysqlimport.
squawknull
Para el registro, LOAD DATA es un comando muy flexible que no requiere entrada CSV; cualquier formato de texto servirá, y hay una serie de parámetros útiles para analizar y manipular datos de entrada. Esta es definitivamente la forma más rápida de cargar datos en una base de datos local. No está claro qué se entiende por "mejor" arriba: es decir, si la simplicidad (use las instrucciones INSERT) supera la velocidad (use LOAD DATA).
EdwardGarson

Respuestas:

298

Del manual de MySQL

Las instrucciones INSERT que usan la sintaxis VALUES pueden insertar varias filas. Para hacer esto, incluya múltiples listas de valores de columna, cada una encerrada entre paréntesis y separadas por comas. Ejemplo:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
nietaki
fuente
77
¿Es esto más lento que Load Data Infile?
srchulo
¿Cuál es la sintaxis para escribir esta declaración de inserción en el procedimiento almacenado?
Nitin Sawant
@Nitin, ¿no sería la misma sintaxis .. ??? Eso es lo que haría en SQL Server de todos modos.
Anuncios del
13
Tenga en cuenta que aunque la pregunta está etiquetada "Cómo hacer inserciones por lotes ", esta respuesta es en realidad una inserción masiva . Bulk suele ser más rápido, vea esta pregunta
Mike Demenok
2
@Koffeehaus Según esta respuesta SO de @Lukman, el número de valores / filas que se pueden insertar está limitado pormax_allowed_packet
Sepster,
22

La mayoría de las veces, no está trabajando en un cliente MySQL y debe insertar lotes por lotes utilizando la API adecuada.

Por ejemplo, en 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
fuente
55
Una buena entrada de blog sobre insertos por lotes (en Java, pero es relevante para cualquier idioma): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur
6

La consulta de carga de archivos de datos es una opción mucho mejor, pero algunos servidores como GoDaddy restringen esta opción en el alojamiento compartido, por lo tanto, solo quedan dos opciones, luego una es insertar registro en cada iteración o inserción por lotes, pero la inserción por lotes tiene su limitación de caracteres si su consulta excede esto número de caracteres establecidos en mysql, entonces su consulta se bloqueará, por lo que sugiero insertar datos en fragmentos con inserción por lotes, esto minimizará el número de conexiones establecidas con la base de datos.

Syed Adeel Ali Rizvi
fuente
1
¿Qué talLOAD DATA LOCAL INFILE '/users/name/txt.file'
Double_j