Estoy pasando un gran conjunto de datos a una tabla MySQL a través de PHP usando comandos de inserción y me pregunto si es posible insertar aproximadamente 1000 filas a la vez a través de una consulta que no sea agregar cada valor al final de una cadena de una milla de largo y luego ejecutándolo Estoy usando el marco CodeIgniter, por lo que sus funciones también están disponibles para mí.
php
mysql
codeigniter
insert
bulkinsert
toofarsideways
fuente
fuente
Respuestas:
Ensamblar una
INSERT
declaración con varias filas es mucho más rápido en MySQL que unaINSERT
declaración por fila.Dicho esto, parece que es posible que se encuentre con problemas de manejo de cadenas en PHP, que en realidad es un problema de algoritmo, no de lenguaje. Básicamente, cuando trabaja con cadenas grandes, desea minimizar las copias innecesarias. Principalmente, esto significa que desea evitar la concatenación. La forma más rápida y eficiente en cuanto a memoria para construir una cadena grande, como para insertar cientos de filas en una, es aprovechar la
implode()
función y la asignación de matriz.La ventaja de este enfoque es que no copia y vuelve a copiar la instrucción SQL que ha reunido hasta ahora con cada concatenación; en cambio, PHP hace esto una vez en la
implode()
declaración. Esta es una gran victoria.Si tiene muchas columnas para armar, y una o más son muy largas, también podría construir un bucle interno para hacer lo mismo y usar
implode()
para asignar la cláusula de valores a la matriz externa.fuente
mysql_real_escape_string
conmysqli_real_escape_string
ymysql_query
con elmysqli_query
que estoy usando MySQLi y éstos han de utilizarse a partir de PHP5. ¡Muchas gracias!mysql_*
se ha eliminado de PHP, así que asegúrese de usar lamysqli_*
interfaz.La inserción múltiple / inserción por lotes ahora es compatible con codeigniter. Tuve el mismo problema Aunque es muy tarde para responder una pregunta, ayudará a alguien. Es por eso que responde esta pregunta.
fuente
Puede preparar la consulta para insertar una fila utilizando la clase mysqli_stmt y luego iterar sobre la matriz de datos. Algo como:
Donde 'idsb' son los tipos de datos que está vinculando (int, double, string, blob).
fuente
Sé que esta es una consulta antigua, pero estaba leyendo y pensé que agregaría lo que encontré en otro lugar:
mysqli en PHP 5 es un ojbect con algunas buenas funciones que le permitirán acelerar el tiempo de inserción para la respuesta anterior:
Desactivar la confirmación automática al insertar muchas filas acelera enormemente la inserción, así que desactívela, luego ejecute como se mencionó anteriormente, o simplemente haga una cadena (sqlCombined) que es muchas instrucciones de inserción separadas por punto y coma y consultas múltiples las manejará bien.
Espero que esto ayude a alguien a ahorrar tiempo (¡buscar e insertar!)
R
fuente
Siempre puedes usar mysql's
LOAD DATA
:hacer inserciones masivas en lugar de usar un montón de
INSERT
declaraciones.fuente
LOCAL
bit.Bueno, no desea ejecutar 1000 llamadas de consulta, pero hacer esto está bien:
Dependiendo de su fuente de datos, llenar la matriz podría ser tan fácil como abrir un archivo y descargar el contenido en una matriz a través de
file()
.fuente
fuente
Puede hacerlo de varias maneras en codeigniter, por ejemplo
fuente
Aunque es demasiado tarde para responder esta pregunta. Aquí está mi respuesta sobre lo mismo.
Si está usando CodeIgniter, puede usar métodos incorporados definidos en la clase query_builder.
$ this-> db-> insert_batch ()
Genera una cadena de inserción basada en los datos que proporciona y ejecuta la consulta. Puede pasar una matriz o un objeto a la función. Aquí hay un ejemplo usando una matriz:
);
El primer parámetro contendrá el nombre de la tabla, el segundo es una matriz asociativa de valores.
Puede encontrar más detalles sobre query_builder aquí
fuente
He creado una clase que realiza varias líneas que se utiliza de la siguiente manera:
donde la clase se define de la siguiente manera:
fuente
Use insertar lote en codeigniter para insertar varias filas de datos.
fuente
He creado esta función simple que ustedes pueden usar fácilmente. Deberá pasar el nombre de la
($tbl)
tabla, el campo de la tabla($insertFieldsArr)
contra sus datos de inserción, la matriz de datos($arr)
.fuente