Inserir Múltiplos Registros no Banco de Dados de Forma Eficiente

sql-icon

Muitos programadores costumam executar vários comandos INSERT quando pretendem inserir múltiplos registros em uma tabela de banco de dados. Porém, quando os dados serão salvos na mesma tabela, não é necessário executar diversos comandos INSERT; apenas um é suficiente.

Por exemplo: em vez de executar:

INSERT INTO tabela(numero) VALUES (1);
INSERT INTO tabela(numero) VALUES (2);
...

Poderíamos executar:

INSERT INTO tabela(numero) VALUES (1), (2);

Vou mostrar uma maneira simples de se fazer isso dinamicamente, com quantidade indeterminada informações, que podem vir de qualquer tipo de fonte de dados.

Vamos considerar um array com números inteiros, de 1 a 10:

$valores = range( 1 , 10 );

Para inserir isso num banco de dados, muitos fariam isto:

$valores = range( 1 , 10 );
for ( $i = 0, $total = count( $valores ); $i < $total; $i++ )
{
    $DB->query( 'INSERT INTO tabela(numero) VALUES
(' . $valores[ $i ] . ')' );
}

Isso funciona. Mas é lento e sobrecarrega o servidor. Imaginem um array com 100 mil valores. Seriam executados 100 mil consultas no banco.

Esse problema é conhecido como O Problema do N + 1. Clique aqui e leia mais sobre isso.

Como Gerar Uma Única SQL Para Inserir Múltiplos Registros

O correto é gerar a string SQL com todos os valores a serem inseridos, separados por vírgula, de forma a executar a consulta apenas uma vez.

Logo, podemos fazer isto:

$valores = range( 1 , 10 );
$sql = sprintf( 'INSERT INTO tabela(numero) VALUES (%s)', implode( '), 
(' , $valores ) );
$DB->query( $sql );

Se dermos um echo em $sql, teremos como saída:

INSERT INTO tabela(numero) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)

Dessa forma só se executa a SQL uma vez, tornando a execução bem mais rápida.

Fonte: http://rberaldo.com.br/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/

Novembro 7th, 2016 Por