Comment faire une insertion par lots dans MySQL


148

J'ai 1-plusieurs nombre d'enregistrements qui doivent être saisis dans une table. Quelle est la meilleure façon de faire cela dans une requête? Dois-je simplement faire une boucle et insérer un enregistrement par itération? Ou y a-t-il un meilleur moyen?


1
Veuillez lire la documentation pour une instruction ou une fonction avant d'essayer de l'utiliser. INSERTprend en charge cela nativement !
Courses de légèreté en orbite le

3
Si vous avez un très grand nombre d'enregistrements et que vous pouvez les formater sous forme de fichier CSV, consultez l'instruction LOAD DATA INFILE ou la commande mysqlimport.
squawknull

Pour mémoire, LOAD DATA est une commande très flexible qui ne nécessite pas d' entrée CSV; n'importe quel format de texte fera l'affaire, et il existe un certain nombre de paramètres utiles pour analyser et manipuler les données d'entrée. C'est certainement le moyen le plus rapide de charger des données dans une base de données locale. Ce que l'on entend par «meilleur» ci-dessus n'est pas clair: c'est-à-dire si la simplicité (utiliser des instructions INSERT) l'emporte sur la vitesse (utiliser LOAD DATA).
EdwardGarson le

Réponses:


298

À partir du manuel MySQL

Les instructions INSERT qui utilisent la syntaxe VALUES peuvent insérer plusieurs lignes. Pour ce faire, incluez plusieurs listes de valeurs de colonne, chacune placée entre parenthèses et séparée par des virgules. Exemple:

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

7
Est-ce plus lent que Load Data Infile?
srchulo

Quelle est la syntaxe pour écrire cette instruction d'insertion dans une procédure stockée?
Nitin Sawant

@Nitin ne serait-ce pas la même syntaxe .. ??? C'est ce que je ferais de toute façon dans SQL Server.
Annonces

13
S'il vous plaît noter que même si la question est étiqueté « Comment faire lot inserts » cette réponse est en fait en vrac insert. Le volume est généralement plus rapide, voir cette question
Mike Demenok

2
@Koffeehaus Selon cette réponse SO de @Lukman, le nombre de valeurs / lignes qui peuvent être insérées est limité parmax_allowed_packet
Sepster

22

La plupart du temps, vous ne travaillez pas dans un client MySQL et vous devez regrouper les insertions en utilisant l'API appropriée.

Par exemple dans 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
Une bonne entrée de blog sur les insertions par lots (en Java, mais c'est pertinent pour n'importe quel langage): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

Charger une requête de fichier de données est une bien meilleure option, mais certains serveurs comme godaddy limitent cette option sur l'hébergement partagé, il ne reste donc que deux options, puis une est insérer un enregistrement à chaque itération ou insertion de lot, mais l'insertion par lot a sa limite de caractères si votre requête dépasse cela nombre de caractères définis dans mysql alors votre requête plantera, donc je suggère d'insérer des données en morceaux avec l'insertion par lots, cela minimisera le nombre de connexions établies avec la base de données.


1
Que diriez-vousLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.