2011-07-31 69 views
338

es la consulta de base de datos más rápido si inserto varias filas a la vez:Insertar varias filas en MySQL

como

INSERT.... 

UNION 

INSERT.... 

UNION 

(tengo que insertar filas como 2-3000)

+8

unión es para selecciona. – Jacob

+1

¿Cómo van las filas? ¿Estás escribiendo directamente SQL en MySQL Query Browser o usando desde dentro PHP o C# o algo más? Si encajas en este último caso, comprueba los siguientes enlaces: [La forma más rápida de insertar 100k registros] (http://codicesoftware.blogspot.com/2008/04/fastest-way-to-insert-100k-registers.html) [Inserciones rápidas con filas múltiples] (http://blog.cnizz.com/2010/05/31/optimize-mysql-queries-fast-mutliple-row-inserts/) – RKh

Respuesta

806

INSERT declaraciones que usan la sintaxis VALUES pueden insertar varias filas. Para hacer esto, incluya múltiples listas de valores de columna, cada uno entre paréntesis y separados por comas.

Ejemplo:

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

Source

+8

Se puede hacer de esta manera, pero él quiere para insertar 3000 filas – RKh

+0

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

+0

también es posible 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. –

42

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

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

Optimizing INSERT Statements

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

+3

¿Qué pasa con los registros duplicados? – Matteo

+2

@Matteo Duplicates será insertado o rechazado por la base de datos según el esquema que haya definido. – dotslash

+0

Usar mysql multiqueries –

16

Puede insertar tantas como filas usando esta secuencia de comandos.

INSERT INTO tableName 
    (column1,column2,column3,column4) 
VALUES 
    ('value1' , 'value2', 'value3','value4'), 
    ('value1' , 'value2', 'value3','value4'), 
    ('value1' , 'value2', 'value3','value4'); 
+29

¿Cómo mejora esto la respuesta de Nicola Cossu de hace cinco años? – John

+6

¿Eres Nicola Cossu? – lalithkumar

5
BEGIN; 
INSERT INTO test_b (price_sum) 
    SELECT price 
    FROM test_a; 
INSERT INTO test_c (price_summ) 
    SELECT price 
FROM test_a; 
COMMIT; 
+0

Esto merece más votos positivos, con esto puede insertar datos a granel recuperados de otras tablas – Novastorm

-1
// 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')"; 
+4

Espera, ¿qué? – proofzy

0

Aquí es una solución PHP listo para su uso con un n: m mesa (muchos-a-muchos relación):

// 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)); 
+0

El uso de la implosión() elude el problema del "último carácter" pero crea una gran sobrecarga de memoria. Ella pidió 3000 filas, imagina que cada fila tiene 1kb de datos, eso es 3MB de datos sin procesar. La matriz ocupará 30 MB de memoria y ya consume otros 30 MB de $ table_1, por lo que la secuencia de comandos usaría 60 MB. Solo digo, de lo contrario, es una buena solución – John

Cuestiones relacionadas