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的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 多行插入是不是获取顺序自动增量 ID?

mysql:插入数据和自动增量

自动增量在 MySQL 中停止了吗?

MySQL - 知道下一个 ID [重复]

MySQL 在从另一个表中选择时插入到具有自动增量的表中

MYSQL从另一个表更新数据,如果存在,否则插入[重复]