Como fazer uma inserção em lote no MySQL

148

Eu tenho um número muitos de registros que precisam ser inseridos em uma tabela. Qual é a melhor maneira de fazer isso em uma consulta? Devo apenas fazer um loop e inserir um registro por iteração? Ou há um modo melhor?

Genadinik
fonte
1
Por favor, leia a documentação de uma declaração ou função antes de tentar usá-la. INSERTsuporta isso nativamente !
Lightness Races in Orbit
3
Se você tiver um número realmente grande de registros e puder formatá-los como um arquivo CSV, consulte a instrução LOAD DATA INFILE ou o comando mysqlimport.
Squawknull
Para o registro, LOAD DATA é um comando muito flexível que não requer entrada CSV; qualquer formato de texto serve, e há vários parâmetros úteis para analisar e manipular dados de entrada. Esta é definitivamente a maneira mais rápida de carregar dados em um banco de dados local. Não está claro o que se entende por "melhor" acima: por exemplo, se a simplicidade (use instruções INSERT) supera a velocidade (use LOAD DATA).
EdwardGarson

Respostas:

298

No manual do MySQL

Instruções INSERT que usam a sintaxe VALUES podem inserir várias linhas. Para fazer isso, inclua várias listas de valores de coluna, cada uma entre parênteses e separadas por vírgulas. Exemplo:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
nietaki
fonte
7
Isso é mais lento que o Load Data Infile?
srchulo 6/11/12
qual é a sintaxe para escrever esta instrução de inserção no procedimento armazenado?
Nitin Sawant
@ Nitin não seria a mesma sintaxe .. ??? É o que eu faria no SQL Server de qualquer maneira.
Anúncios
13
Observe que, enquanto a pergunta está rotulada como "Como inserir inserções em lote ", esta resposta é na verdade inserção em massa . Granel é geralmente mais rápido, consulte esta pergunta
Mike Demenok
2
@Koffeehaus Por esta resposta SO de @Lukman, número de valores / linhas que podem ser inseridos é limitada pormax_allowed_packet
Sepster
22

Na maioria das vezes, você não está trabalhando em um cliente MySQL e deve inserir em lote usando a API apropriada.

Por exemplo, no JDBC:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm

Kamran
fonte
5
Uma entrada de blog bom em inserções de lote (em Java, mas é relevante para qualquer idioma): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur
6

A opção Carregar consulta de infile de dados é uma opção muito melhor, mas alguns servidores, como godaddy, restringem essa opção em hospedagem compartilhada, portanto, apenas duas opções são deixadas e uma é inserir registro em todas as iterações ou inserções em lote, mas a inserção em lote tem sua limitação de caracteres se sua consulta exceder esse valor. número de caracteres definido no mysql, então sua consulta falhará, então sugiro inserir dados em pedaços com inserção em lote, isso minimizará o número de conexões estabelecidas com o banco de dados.

Syed Adeel Ali Rizvi
fonte
1
Como sobreLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j