Je veux insérer certaines lignes de 4K dans la DB MySQL. Je ne veux pas tirer des requêtes de 4k 'insert'. Y a-t-il un moyen par lequel je ne peux tirer que d'une seule requête pour stocker ces lignes 4K dans la DB. P>
J'ai recherché sur Internet et partout j'ai constaté que les utilisateurs font une insertion en vrac dans la DB à partir d'un fichier. P>
Dans mon cas, j'ai les données dans la mémoire et je ne veux pas d'abord écrire ces données dans un fichier pour faire un insert en vrac. Si je fais cela, je vais ajouter du délai dans le programme. P>
5 Réponses :
Vous pouvez écrire un seul insérer Code> strong>
Query qui ferait plusieurs insertions dans un seul appel à la base de données:
insert into your_table (field1, field2, field3) values (value1_1, value1_2, value1_3), (value2_1, value2_2, value2_3), (value3_1, value3_2, value3_3)
Je pense que la DB a mis des contraintes sur la longueur de la requête. En cas de 3 rangées, cela fonctionnera mais en cas de lignes de 4k, je ne pense pas que cela fonctionnera
Cela a fonctionné pour moi lorsque j'ai essayé d'insérer 1000 lignes (8 x int, 2 x chaîne). Mais quand j'ai essayé 2000 lignes, j'ai eu une erreur "Server MySQL a disparu". Pour résoudre ce problème, je vais essayer d'insérer 1000 rangées à une heure comme James C suggère.
@Pascal est cet atomique? Est-il possible que si la DB se bloque à mi-chemin, seules deux lignes sur trois sont insérées?
@Yatendragoel: Vous pouvez toujours séparer votre ensemble d'inserts mono-éléments dans N- (4K / N) -ELS -ELS -ELS-INSERTS.
La commande En référence à la suggestion de Pascal, sauf si votre commande dépasse de charge de MySQL code> peut vous être utile: http://dev.mysql.com/doc/refman/5.5/fr/load-Data.html p>
max_allowed_packet code>, vous devriez pouvoir exécuter cette requête. Dans de nombreux cas, cela fonctionne mieux pour créer quelques inserts plus petits avec 1000 rangées dans chacune. P>
Vous pouvez Exécuter vos déclarations en lot A>, Certains exemple de code peuvent être trouvés ici . < / p>
Aussi, setautocommit (FALSE) CODE> et appelez
Conn.commit (); code> après
ExecuteBatch () code> Pour minimiser le nombre de commits. p>
dans MySQL Vous pouvez utiliser la charge de charge infilière
LOAD DATA INFILE 'C:\MyTextFile' INTO TABLE myDatabase.MyTable FIELDS TERMINATED BY ','
mysqli_query($cons, ' LOAD DATA LOCAL INFILE "'.$file.'" INTO TABLE tablename FIELDS TERMINATED by \',\' LINES TERMINATED BY \'\n\' IGNORE 1 LINES (isbn10,isbn13,price,discount,free_stock,report,report_date) SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))), RRP_nl = RRP * 1.44 + 8, RRP_bl = RRP * 1.44 + 8, ID = NULL ')or die(mysqli_error()); $affected = (int) (mysqli_affected_rows($cons))-1; $log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');