2013-03-04 66 views
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; 
+0

我是否正確理解您要組織事物,以便對於源表A中具有相同'nr'值的每組行,您希望(a)在表C中插入一條記錄以獲取新的唯一(b)您想要將源表A中的記錄插入結果表B,爲組中的每條記錄分配新的唯一ID?如果沒有,請解釋 - 可能是通過編輯問題而不是額外評論中的解釋。 – 2013-03-04 18:16:55

+0

@JonathanLeffler是的,這就是我需要的。 – 2013-03-05 06:58:44

+0

查看程序解決方案相對容易: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

回答

0

我的最終解決方案是這樣的:

insert into B(FK_ID, ...) 
select InsertC(nr), ... from A; 

InsertC是一個功能

CREATE FUNCTION `InsertC`(pOldID BIGINT) RETURNS bigint(20) 
BEGIN 

    set @newID = (select ID from B where OldID = pOldID); 

    if @newID is null then 
     insert into C(..., OldID) 
     values(..., pOldID); 

     set @newID = LAST_INSERT_ID(); 
    end if; 

    RETURN @newID; 
END 

我還是B中需要一個新的列(OLDID +就可以了指數),但這是比以前快得多。