1

我有 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_customersnew_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 解决方案:
创建一个声明 CURSOR 的 PROCEDURE,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中发现的那样

4

2 回答 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

于 2012-06-30T17:02:00.777 回答
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 会很慢...

于 2012-08-01T21:57:53.223 回答