MySQL从表中插入,分配自动增量ID并在第三个表中更新FK

时间:2012-06-30 16:46:20

标签: mysql insert foreign-keys last-insert-id

我有3张桌子

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
..   ..

我想将old_customers复制到new_customers,为其分配新的自动增量ID并更新订单外键customer_id
如何在一个简单的MySQL查询中同时执行INSERT和UPDATE?

一个基本的psudo-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


<小时/> 一周后......

感谢收到的帮助,这是开发的MySQL解决方案:
创建一个PROCEDURE,在LOOP中声明CURSOR和INSERT + UPDATE获取的结果

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//

这是一个没有控制变量且没有标签的循环,正如我在Simple Cursor Traversal 2

中找到的那样

2 个答案:

答案 0 :(得分:1)

为什么不写udf,它会帮助您达到要求。

为此目的的程序将是这样的::

按照步骤::

1)获取new_customer表中使用的最大id,例如。

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

并将其作为v_curr_id存储在变量中。 2)创建一个游标,迭代并读取old_customer的每一行,并每次将其存储到变量v_old_cust_id,v_old_custname中 3)光标内:  增加v_curr_id并在new_cust表中插入一个新行,其cust_id为v_curr_id,名称为v_old_custname。 例如

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

然后更新order_table,如

 update order_table set cust_id = v_curr_id where cust_id=v_old_custname;

4)创建后,您只需调用该过程即可 喜欢

call my_proc()

有关语法参考,请访问cursor_example

答案 1 :(得分:0)

UDF?来吧...

只需将旧客户数据复制到new_customer表中,将old_id添加为列,以便以这种方式更新:

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 with cursor将太慢......