Insertar MySQL desde una tabla asignando ID de incremento automático y actualizando FK en la tercera tabla

Tengo 3 mesas

old_customers
id   name
 5   Mario
13   John
..   ...

new_customers
id   name   address
 7   Luigi  Roma
..   ...    ...

orders
id   customer_id
 1   5
 2   7
 3   13
..   ..

Quiero copiar old_customers a new_customers asignándoles una nueva identificación de incremento automático y actualizando la clave externa de las órdenes customer_id.
¿Cómo realizar esta INSERCIÓN y ACTUALIZACIÓN simultáneas en una sola consulta de MySQL?

Una idea básica de pseudo-sql

INSERT INTO new_customers (name) SELECT name FROM old_customers
AND
UPDATE orders SET customer_id=LAST_INSERT_ID() WHERE customer_id=old_customers.id



Una semana después ...

Gracias a la ayuda recibida, esta es la solución MySQL desarrollada:
cree un PROCEDIMIENTO que declare un CURSOR e INSERTAR + ACTUALIZAR resultados obtenidos en un BUCLE

DELIMITER //

CREATE PROCEDURE move_costumers()
BEGIN
  DECLARE fetched_id INT(3);
  DECLARE fetched_name VARCHAR(50);
  DECLARE my_cursor CURSOR FOR SELECT id,name FROM old_customers;

  OPEN my_cursor;  
  BEGIN
    DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END; 
    LOOP
      FETCH my_cursor INTO fetched_id,fetched_name; 
      INSERT INTO new_customers (name) VALUES (fetched_name);
      UPDATE orders SET orders.customer_id = LAST_INSERT_ID() 
        WHERE orders.customer_id = fetched_id;
    END LOOP;
  END;
  CLOSE my_cursor;
END//

Es un bucle sin variable de control y sin etiqueta, como encontré en Cursor simple transversal 2

preguntado el 30 de junio de 12 a las 17:06

2 Respuestas

¿Por qué no escribes un udf, le ayudará a lograr su requisito.

El procedimiento para este fin será algo así::

Sigue los pasos ::

1) Obtenga la identificación más grande utilizada en la tabla new_customer, por ejemplo.

(Select max(id) into v_curr_id from new_users group by user_id)

y almacenarlo en una variable como v_curr_id. 2) Cree un cursor que itere y lea cada fila de old_customer y cada vez que lo almacene en una variable v_old_cust_id, v_old_custname 3) Dentro del cursor: incremente v_curr_id e inserte una nueva fila en la tabla new_cust que tenga cust_id como v_curr_id y nombre como v_antiguo_nombrecliente. p.ej

insert into new_customers(id, name) values (v_curr_id,v_old_custname);

Luego actualice order_table como

 update order_table set cust_id = v_curr_id where cust_id=v_old_custname;

4) Después de la creación, solo tendrá que llamar al procedimiento como

call my_proc()

Para referencia de sintaxis, visite cursor_ejemplo

Respondido el 30 de junio de 12 a las 21:06

Perdón por mi pregunta ingenua, soy realmente nuevo en sql. Traté de usar varios enfoques como while, loop, trigger, create approach... Pero con malos resultados. Estoy agradecido incluso por una simple sugerencia sobre qué enfoque podría funcionar. - El Salvador

@Salvador No hay problema amigo, he editado mi respuesta, espero que esto ayude :-) - sashi kant

Sashi muchas gracias por tus sugerencias! Lo siento, pero dudo en establecer esto como respuesta aceptada porque es una pista muy útil pero incompleta. - El Salvador

¿UDF? vamos...

simplemente copie los datos antiguos del cliente en la tabla new_customer, agregando old_id como columna para que pueda actualizar de esta manera:

INSERT INTO new_customers (name,old_id) SELECT name, id FROM old_customers

UPDATE orders o
SET customer_id = (select id form new_customers nc where nc.old_id = o.id)

Proc con el cursor será muuuuy lento...

Respondido 01 ago 12, 22:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.