MySQL inserir linhas de 20K numa única inserção
Posso inserir os 20000 numa única consulta?
o que acontecerá se houver erros nestas 20000 linhas? como é que o mysql vai lidar com isso?
3 answers
Se estiver a inserir as linhas de alguma outra tabela, então poderá usar o inserir ... Seleccionar padrão para inserir as linhas.
No entanto, se estiver a inserir os valores usando o padrão INSERT ... VALUES
, então terá o limite de max_ allowed_packet.
Também do docs: -
Para optimizar a velocidade de inserção, combine muitas pequenas operações num único grande operação. Idealmente, você faz uma única conexão, envia os dados para muitas linhas novas ao mesmo tempo, e atrasar todas as actualizações de índices e consistência a verificar até ao fim.
Exemplo: -
INSERT INTO `table1` (`column1`, `column2`) VALUES ("d1", "d2"),
("d1", "d2"),
("d1", "d2"),
("d1", "d2"),
("d1", "d2");
O que acontecerá se houver erros nestas 20000 linhas?
Se houver erros ao inserir os registos, a operação será interrompida.
Http://dev.mysql.com/doc/refman/5.5/en/insert.html
Inserir declarações que usam valores a sintaxe pode inserir várias linhas. Para faça isso, inclua várias listas de valores de colunas, cada uma incluída dentro parênteses e separados por vírgulas.
Exemplo:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Pode usar o código para gerar a secção inserir VALUES
com base na sua fonte de dados.
Erros: Se houver erros na Declaração INSERT
(incluindo em qualquer uma das linhas) a operação será interrompida.
Gerando a consulta - isso será baseado em sua fonte de dados, por exemplo, se você está recebendo dados de uma matriz associativa em PHP, você vai fazer algo assim:
$sql = "INSERT INTO tbl_name (a, b, c) VALUES ";
foreach($dataset as $row)
{
$sql .= "(" + $row['a'] + ", " + $row['a'] + ", " + $row['a'] + ")";
// OR
$sql .= "($row[a], $row[b], $row[c])";
}
Mais alguns recursos:
Optimize As Consultas MySQL-Inserções Rápidas Com Várias Linhas
Lote inserir com SQL: inserir no quadro (col...coln) values (col... coln), (col...coln)... mas o tamanho do SQL é limitado por padrão de 1M, você pode alterar o parâmetro max_ allowed_ Packet para suportar uma única inserção maior