sql >> Base de Datos >  >> RDS >> Mysql

Inserción por lotes de datos en la base de datos MySQL usando php

¿Usando un bucle for?

Pero la opción más rápida para cargar datos en MySQL es usar CARGAR ARCHIVO DE DATOS comando, puede crear el archivo para cargar a través de PHP y luego enviarlo a MySQL a través de un proceso diferente (o como un paso final en el proceso original).

Si no puede usar un archivo, use la siguiente sintaxis:

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

por lo que reduce la cantidad total de oraciones a ejecutar.

EDITAR:dado su fragmento, parece que puede beneficiarse de INSERT... ON ACTUALIZACIÓN DE CLAVE DUPLICADA sintaxis de MySQL, dejando que la base de datos haga el trabajo y reduciendo la cantidad de consultas. Esto supone que su tabla tiene una clave principal o un índice único.

Para acceder a la base de datos cada 100 filas, puede hacer algo como (REVISE Y ARREGLE A SU ENTORNO )

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

Y executeQueries tomaría la matriz y enviaría una única consulta múltiple:

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