Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Inserção em lote de dados no banco de dados MySQL usando php


Usando um loop for?

Mas a opção mais rápida para carregar dados no MySQL é usar o CARREGAR INFIL DE DADOS comando, você pode criar o arquivo para carregar via PHP e então alimentá-lo para o MySQL através de um processo diferente (ou como uma etapa final no processo original).

Se você não puder usar um arquivo, use a seguinte sintaxe:
insert into table(col1, col2) VALUES (val1,val2), (val3,val4), (val5, val6)

assim você reduz a quantidade total de frases a serem executadas.

EDIT:Dado o seu snippet, parece que você pode se beneficiar do INSERT ... ON ATUALIZAÇÃO DE CHAVE DUPLICADA sintaxe do MySQL, deixando o banco de dados fazer o trabalho e reduzindo a quantidade de consultas. Isso pressupõe que sua tabela tenha uma chave primária ou índice exclusivo.

Para acessar o banco de dados a cada 100 linhas, você pode fazer algo como (REVISE-O E CORRIJA-O PARA SEU 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 pegaria o array e enviaria uma única consulta múltipla:
function executeQueries($queries) {
   $data = "";
     foreach ($queries as $query) {
        $data.=$query.";\n";
    }
    executeQuery($data);
}