Insertar múltiples filas en mysql


349

¿La consulta de la base de datos es más rápida si inserto varias filas a la vez:

me gusta

INSERT....

UNION

INSERT....

UNION

(Necesito insertar como 2-3000 filas)


8
UNION es para selectos.
Jacob

1
¿Cómo van las filas? ¿Está escribiendo directamente SQL en MySQL Query Browser o está usando desde PHP o C # u otra cosa? Si encaja en el último caso, verifique los siguientes enlaces: La forma más rápida de insertar inserciones rápidas de
RKh

Respuestas:


1176

INSERTlas declaraciones que usan VALUESsintaxis pueden insertar varias filas. Para hacer esto, incluya múltiples listas de valores de columna, cada una encerrada entre paréntesis y separadas por comas.

Ejemplo:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

Fuente


@RPK. Estoy de acuerdo contigo pero no conozco su fuente de datos. Como ya escribí, si ella tiene un archivo, usaría la sintaxis de datos de carga como sugiere cularis. :)
Nicola Cossu

También es posible de usar INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. por supuesto, esto solo será mejor si los valores insertados provienen de diferentes tablas.
Zohar Peled

72
Referencia útil, porque a veces solo olvido la sintaxis simple.
Captain Hypertext

¿A, B y C aquí variables temporales almacenan el contenido de las filas?
Lealo

3
@Lealo no, son los nombres de columna de la tabla en los que insertar los valores en el mismo orden.
BeetleJuice

60

Si tiene sus datos en un archivo de texto, puede usar LOAD DATA INFILE .

Al cargar una tabla desde un archivo de texto, use LOAD DATA INFILE. Esto suele ser 20 veces más rápido que usar instrucciones INSERT.

Optimización de declaraciones INSERT

Puede encontrar más consejos sobre cómo acelerar sus declaraciones de inserción en el enlace de arriba.


3
¿Qué pasa con los registros duplicados?
Matteo

2
Los duplicados de @Matteo serán insertados o rechazados por la base de datos según el esquema que haya definido.
ankush981

Use mysql multiqueries
Francisco Yepes Barrera

1
Segundo enlace 404.
dimir

1
El enlace roto "Declaraciones de velocidad de inserción" ahora está cubierto en: Optimización de declaraciones INSERT .
Kenneth M. Kolano

27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;

3
Esto merece más votos a favor, con esto puede insertar datos en masa recuperados de otras tablas
Novastorm

44
Si solo hubiera una explicación de lo que está sucediendo en este código, dado que tengo que "insertar datos en masa recuperados de otras tablas" ...
Aleister Tanek Javas Mraz

0

Aquí hay una solución PHP lista para usar con una tabla: m (relación de muchos a muchos):

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));

El uso de implode () evita el problema del "último personaje" pero crea una gran sobrecarga de memoria. Ella pidió 3000 filas, imagina que cada fila tiene 1kb de datos, eso ya son 3MB de datos sin procesar. La matriz ocupará 30 MB de memoria que ella ya consume otros 30 MB de $ table_1 para que el script use 60 MB. Solo digo, de lo contrario, es una buena solución
John

Es útil para mi situación.
Bilal Şimşek

-11
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";

Además de la confusión de esta respuesta, también puede ser vulnerable a la inyección de SQL, suponiendo que esté usando PHP.
ultrafez

2
1. Hay un error en su código SQL. 2. El siguiente valor de $ sql reemplazará el valor anterior de $ sql.
Marwan Salim
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.