2012-04-09 232 views
5

Tengo dos tablas, una vinculada a la clave principal de la otra. En el momento en que INSERTO en la tabla A, obtengo el LAST_INSERT_ID, y luego INSERT en la tabla B.Usar Mysql para hacer INSERT múltiple en tablas vinculadas

Pero tengo cientos de registros para insertar y quiero acelerar las cosas.

en MySQL puede:

INSERT INTO table_a (v1, v2, c3) VALUE (0, 1, 2); 

INSERT INTO table_a (v1, v2, v3) VALUE (4, 5, 6); 

etc, o

INSERT INTO table_a (v1, v2, v3) VALUE (0, 1, 2), (4, 5, 6), etc para agregar varias entradas más rápido - pero sólo por una mesa.

Por supuesto, este último es mucho más rápido. Me preguntaba si era posible replicar este comportamiento para mi ejemplo con dos tablas vinculadas utilizando un Procedimiento almacenado, y si tendría una mejora dramáticamente similar en el rendimiento:

algo así como: llame a special_insert ((0, 1, 2), (4, 5, 6), etc.); o similar.

que no tienen experiencia procedimiento almacenado, así que estoy pescando para las ideas de la dirección de proceder.

+0

El SP le permite simular una inserción monolítica de varias mesas. La pregunta sería ... ¿cómo podría separar los datos de la tabla A de los datos de la tabla B en la lista de parámetros? –

+0

Bueno, al escribir mi propio Procedimiento almacenado, sabría qué significarían los datos en la lista de parámetros ... ¿Sería el SP significativamente más rápido que los INSERTOS individuales? –

+1

No sé de manera significativa. Tendría que comparar ambos métodos, pero al final seguiría haciendo dos insertos y no puede evitar ese hecho. –

Respuesta

1

Después de algunas investigaciones más parece como si el SP no ofrecería mejoras significativas de velocidad y no puede aceptar parámetros a granel como INSERT INTO

MySQL Stored Procedure vs. complex query

Pero todavía tenía que insertar un número bastante grande de registros vinculados en uno, así que hice lo siguiente:

INSERT INTO a (x, y) VALUES (1,2), (3,4), (5,6), ... (N-1, N)

id = GET_LAST INSERT_ID

ids van desde id para ID + N, siempre y cuando utilizamos tablas InnoDB:

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

http://gtowey.blogspot.com/2012/02/multi-insert-and-lastinsertid.html

y luego

INSERT INTO b (a_id, z) VALUES (id, 2), (id + 1,4), (id + 2,6), ... (id + N, 11) solo tienes que saber el incremento de incremento de MySQL de la replicación.

7

Aquí se muestra un ejemplo de un procedimiento de almacenamiento con una inserción de dos tipos de tabla que incluye LAST_INSERT_ID().

DELIMITER // 
CREATE PROCEDURE new_person(
    first CHAR(35), last CHAR(35), email CHAR(255), tool_id INT) 
BEGIN 
START TRANSACTION; 
    INSERT INTO person(firstname, lastname, email) 
    VALUES(first, last, email); 

    INSERT INTO tasks (engineer_id, tool_id) 
    VALUES(LAST_INSERT_ID(), tool_id); 
COMMIT; 
END// 
DELIMITER ; 

CALL new_person('Jerry', 'Fernholz', '[email protected]', 1); 
+0

ese es un ejemplo SP muy sucinto, gracias, lo aprecio.¿Sería posible pasar una matriz, como: LLAME a nueva_persona (('Jerry', 'Fernholz', '[email protected]', 1), ('Bob', 'Smith','[email protected] ', 2), (' Sally ',' Wood ',' me @ s.com ', 2), (' Will ',' Black ',' [email protected] ', 3)); ? –

+0

No, cualquiera que sea el idioma que use debe llamar al SP cada vez que se itera a través de la matriz. – eabraham

Cuestiones relacionadas