我有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
中找到的那样答案 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将太慢......