10
votes

Insert mysql en vrac

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.

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.

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.


0 commentaires

5 Réponses :


16
votes

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)


4 commentaires

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.



8
votes

La commande de charge de MySQL peut vous être utile: http://dev.mysql.com/doc/refman/5.5/fr/load-Data.html

En référence à la suggestion de Pascal, sauf si votre commande dépasse max_allowed_packet , 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.


0 commentaires

6
votes

Vous pouvez Exécuter vos déclarations en lot , Certains exemple de code peuvent être trouvés ici . < / p>

Aussi, setautocommit (FALSE) et appelez Conn.commit (); après ExecuteBatch () Pour minimiser le nombre de commits.


0 commentaires

0
votes

dans MySQL Vous pouvez utiliser la charge de charge infilière

LOAD DATA INFILE 'C:\MyTextFile'
INTO TABLE myDatabase.MyTable
FIELDS TERMINATED BY ','


0 commentaires

2
votes

Insérer Bulk Plus de 7000000 Enregistrez en 1 minutes dans la base de données (Superfast requête avec calcul)
    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.');


0 commentaires