MySQL 从分配自动增量 ID 的表插入并更新第三个表中的 FK
Posted
技术标签:
【中文标题】MySQL 从分配自动增量 ID 的表插入并更新第三个表中的 FK【英文标题】:MySQL insert from a table assigning auto-increment ID and update FK in third table 【发布时间】:2012-06-30 16:46:19 【问题描述】:我有 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 声明一个 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中发现的那样
【问题讨论】:
【参考方案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
【讨论】:
对不起我的幼稚问题,我真的是 sql 新手。我尝试使用各种方法,例如 while、循环、触发器、创建过程……但效果不佳。我很感激即使是关于哪种方法可行的简单建议。 @Salvador 没问题的朋友,我已经编辑了我的答案,希望这会有所帮助:-) Sashi 非常感谢您的建议!抱歉,我很犹豫是否将其设置为已接受的答案,因为这是一个非常有用但不完整的曲目。【参考方案2】: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)
带光标的处理会很慢...
【讨论】:
以上是关于MySQL 从分配自动增量 ID 的表插入并更新第三个表中的 FK的主要内容,如果未能解决你的问题,请参考以下文章