Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion par lots de données dans la base de données MySQL à l'aide de php

Utiliser une boucle for ?

Mais l'option la plus rapide pour charger des données dans MySQL est d'utiliser le CHARGER LE FICHIER DE DONNEES commande, vous pouvez créer le fichier à charger via PHP, puis le transmettre à MySQL via un processus différent (ou en tant qu'étape finale du processus d'origine).

Si vous ne pouvez pas utiliser un fichier, utilisez la syntaxe suivante :

insert into table(col1, col2) VALUES (val1,val2), (val3,val4), (val5, val6)

vous réduisez donc le nombre total de phrases à exécuter.

EDIT :Compte tenu de votre extrait, il semble que vous puissiez bénéficier de la INSERT ... ON MISE À JOUR DE LA CLÉ EN DOUBLE syntaxe de MySQL, laissant la base de données faire le travail et réduisant le nombre de requêtes. Cela suppose que votre table a une clé primaire ou un index unique.

Pour atteindre la base de données toutes les 100 lignes, vous pouvez faire quelque chose comme (VEUILLEZ LE REVISER ET LE CORRIGER À VOTRE ENVIRONNEMENT )

$insertOrUpdateStatement1 = "INSERT INTO table (col1, col2) VALUES ";
$insertOrUpdateStatement2 = "ON DUPLICATE KEY UPDATE ";
$counter = 0;
$queries = array();

foreach($itemList as $key => $item){
    $val1 = escape($item->col1); //escape is a function that will make 
                                 //the input safe from SQL injection. 
                                 //Depends on how are you accessing the DB

    $val2 = escape($item->col2);

    $queries[] = $insertOrUpdateStatement1. 
    "('$val1','$val2')".$insertOrUpdateStatement2.
    "col1 = '$val1', col2 = '$val2'";

    $counter++;

    if ($counter % 100 == 0) {
        executeQueries($queries);
        $queries = array();
        $counter = 0;
    }
}

Et executeQueries saisirait le tableau et enverrait une seule requête multiple :

function executeQueries($queries) {
   $data = "";
     foreach ($queries as $query) {
        $data.=$query.";\n";
    }
    executeQuery($data);
}