0
我有2個表有一個一對多的關係,我需要以下插入:插入相關表
A - source table
nr Name
1 a
1 b
1 c
2 d
2 e
546 abc
546 asd
546 qwe
B - results table
FK_ID Name
...
6 a
6 b
6 c
7 d
7 e
8 abc
8 asd
8 qwe
C - table with unique IDs
ID
...
5
6 (new)
7 (new)
8 (new)
我從源表行,將其插入結果表 ,並且對於每個組,我需要在具有唯一ID的表中插入一行,並更新結果表中的插入行,因此我有B和C之間的關係(ID是C中的自動遞增)。
我應該做一個前/後的INSERT觸發器,或有一種更快的方式(> 10萬行)
編輯:
我刪除從B外鍵,這樣我就可以插入B中的任何東西,但第2步現在太多了(3k行/ 10分鐘)。
-- step 1
insert into B(..., helperColumn)
select ..., 1 from A;
-- step 2
myloop: WHILE true DO
set @updateID = (select ID from B where helperColumn = 1 limit 1);
if @updateID is null then
LEAVE myloop;
end if;
insert into C(...)
values(...);
set @id = LAST_INSERT_ID();
update B
set ID = @id, helperColumn = 0
where ID = @updateID
and helperColumn = 1;
END WHILE;
我是否正確理解您要組織事物,以便對於源表A中具有相同'nr'值的每組行,您希望(a)在表C中插入一條記錄以獲取新的唯一(b)您想要將源表A中的記錄插入結果表B,爲組中的每條記錄分配新的唯一ID?如果沒有,請解釋 - 可能是通過編輯問題而不是額外評論中的解釋。 – 2013-03-04 18:16:55
@JonathanLeffler是的,這就是我需要的。 – 2013-03-05 06:58:44
查看程序解決方案相對容易:SELECT DISTINCT nr FROM A;'一次一個地收集變量'nr_val'的結果。對於每個返回的值,執行:'INSERT INTO C'在變量'new_id'中獲得新的唯一ID,然後'INSERT INTO B SELECT new_id,old_data FROM WHERE nr = nr_val;'和'DELETE FROM A WHERE nr = nr_val;'。我不確定在MySQL中封裝它的最佳方式是什麼。將它作爲面向集合的操作的難點在於將B的新ID與主插入操作相匹配的步驟。 – 2013-03-05 15:47:47