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

それらに新しい自動インクリメントIDを割り当て、注文の外部キーを更新するようにコピーold_customersしたいと思います。 この同時の INSERT と UPDATE を 1 つの単純な MySQL クエリで実行するにはどうすればよいですか? new_customerscustomer_id

基本的な 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をインクリメントし、cust_idをv_curr_id、名前をasとしてnew_custテーブルに新しい行を挿入します。 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 に答える