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?

Genadinik
la source
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);
nietaki
la source
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

Kamran
la source
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
8
Insert into table(col1,col2) select col1,col2 from table_2;

Veuillez vous référer à la documentation MySQL sur l'instruction INSERT

Monsieur Lou
la source
qu'en est-il des insert into select from performances? est-ce aussi rapide qu'une insertion en vrac?
hiway
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.

Syed Adeel Ali Rizvi
la source
1
Que diriez-vousLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j