Estou passando um grande conjunto de dados para uma tabela MySQL via PHP usando comandos insert e estou imaginando se é possível inserir aproximadamente 1000 linhas por vez através de uma consulta que não seja a adição de cada valor no final de uma string de uma milha e, em seguida, executando. Estou usando a estrutura CodeIgniter para que suas funções também estejam disponíveis para mim.
php
mysql
codeigniter
insert
bulkinsert
toofarsideways
fonte
fonte
Respostas:
Montar uma
INSERT
instrução com várias linhas é muito mais rápida no MySQL do que umaINSERT
instrução por linha.Dito isso, parece que você pode estar enfrentando problemas de manipulação de string no PHP, o que é realmente um problema de algoritmo, não de linguagem. Basicamente, ao trabalhar com cadeias grandes, você deseja minimizar as cópias desnecessárias. Principalmente, isso significa que você deseja evitar a concatenação. A maneira mais rápida e eficiente de criar uma string grande, como inserir centenas de linhas em uma, é aproveitar a
implode()
função e a atribuição da matriz.A vantagem dessa abordagem é que você não copia e copia novamente a instrução SQL que você montou até agora com cada concatenação; em vez disso, o PHP faz isso uma vez na
implode()
declaração. Esta é uma grande vitória.Se você tiver muitas colunas para montar e uma ou mais forem muito longas, também poderá criar um loop interno para fazer a mesma coisa e usar
implode()
para atribuir a cláusula values à matriz externa.fonte
mysql_real_escape_string
commysqli_real_escape_string
emysql_query
com omysqli_query
uso do MySQLi e estes foram preteridos a partir do PHP5. Muito Obrigado!mysql_*
foi removido do PHP, portanto, certifique-se de usar amysqli_*
interface.Inserção múltipla / inserção em lote agora é suportada pelo codeigniter. Eu tive o mesmo problema. Embora seja muito tarde para responder à pergunta, isso ajudará alguém. Por isso, respondendo a essa pergunta.
fonte
Você pode preparar a consulta para inserir uma linha usando a classe mysqli_stmt e, em seguida, iterar sobre a matriz de dados. Algo como:
Onde 'idsb' são os tipos de dados que você está vinculando (int, double, string, blob).
fonte
Sei que essa é uma consulta antiga, mas estava lendo e pensei em adicionar o que encontrei em outro lugar:
O mysqli no PHP 5 é um objeto com algumas boas funções que permitem acelerar o tempo de inserção da resposta acima:
Desativar a confirmação automática ao inserir muitas linhas acelera bastante a inserção, portanto, desative-a e execute como mencionado acima, ou apenas crie uma string (sqlCombined) que é muitas instruções de inserção separadas por ponto-e-vírgula e multi-consultas.
Espero que isso ajude alguém a economizar tempo (pesquisando e inserindo!)
R
fonte
Você sempre pode usar o mysql
LOAD DATA
:para fazer inserções em massa em vez de usar várias
INSERT
instruções.fonte
LOCAL
bit.Bem, você não deseja executar 1000 chamadas de consulta, mas fazer isso é bom:
Dependendo da fonte de dados, preencher a matriz pode ser tão fácil quanto abrir um arquivo e despejar o conteúdo em uma matriz via
file()
.fonte
fonte
Você pode fazer isso de várias maneiras no codeigniter, por exemplo
fonte
Embora seja tarde demais para responder a esta pergunta. Aqui está a minha resposta sobre o mesmo.
Se você estiver usando o CodeIgniter, poderá usar os métodos embutidos definidos na classe query_builder.
$ this-> db-> insert_batch ()
Gera uma string de inserção com base nos dados que você fornece e executa a consulta. Você pode passar uma matriz ou um objeto para a função. Aqui está um exemplo usando uma matriz:
);
O primeiro parâmetro conterá o nome da tabela, o segundo é uma matriz associativa de valores.
Você pode encontrar mais detalhes sobre o query_builder aqui
fonte
Eu criei uma classe que executa várias linhas que é usada da seguinte maneira:
onde a classe é definida da seguinte maneira:
fonte
Use inserir lote no codeigniter para inserir várias linhas de dados.
fonte
Eu criei essa função simples que vocês podem usar facilmente. Você precisará passar o nome da
($tbl)
tabela, o campo da tabela para os($insertFieldsArr)
dados inseridos, matriz de dados($arr)
.fonte