Mysql
 sql >> Database >  >> RDS >> Mysql

Inserimento batch di dati nel database MySQL utilizzando php

Utilizzi un ciclo for?

Ma l'opzione più rapida per caricare i dati in MySQL è usare CARICA FILE DATI comando, puoi creare il file da caricare tramite PHP e quindi inviarlo a MySQL tramite un processo diverso (o come passaggio finale del processo originale).

Se non puoi utilizzare un file, utilizza la seguente sintassi:

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

quindi riduci al numero totale di frasi da eseguire.

EDIT:dato il tuo snippet, sembra che tu possa trarre vantaggio da INSERT ... ON AGGIORNAMENTO CHIAVE DUPLICATA sintassi di MySQL, lasciando che il database faccia il lavoro e riducendo la quantità di query. Ciò presuppone che la tua tabella abbia una chiave primaria o un indice univoco.

Per raggiungere il DB ogni 100 righe puoi fare qualcosa del tipo (PER FAVORE ESAMINALO E FISSALO AL TUO AMBIENTE )

$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;
    }
}

E executeQueries prenderebbe l'array e invierebbe una singola query multipla:

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