2014-03-05 54 views
0

我想寫一個數據庫遷移腳本中添加一列包含現有數據表,然後填充適當的數據列。更新多行與值從一個臨時表

我做的幾個步驟的遷移。我已經創建了一個包含IDS這樣的單列臨時表:

new_column 
========== 
1000 
1001 
1002 
1003 
... 

我現在想更新現有的表,以便在上面的臨時表中的每一行用於在我現有的更新每一行表。現有的表看起來像這樣:

old_column_1 | old_column_2 | new_column 
======================================== 
1   | 100   | null 
2   | 101   | null 
3   | 102   | null 
... 

我已經試過這種更新的一些變化 -

select min(t.new_column) 
from temp t 
where t.new_column not in (select new_column from existing_table); 

但我似乎無法得到正確的語法...

+0

請解釋其從臨時表中的值應該在舊錶被分配給哪一行?爲什麼查詢使用'min'功能? – krokodilko

回答

0

您的問題比您想象的更復雜。沒有什麼可以加入的。因此,要麼編寫一個存儲過程,它使用一個遊標循環遍歷兩個表並逐行更新現有的表(這可能很快就會成爲性能噩夢,因此我不推薦它),或者使用這個有點複雜的查詢:

CREATE TABLE temp 
    (id int auto_increment primary key, `new_column` int) 
; 

INSERT INTO temp 
    (`new_column`) 
VALUES 
    (1000), 
    (1001), 
    (1002), 
    (1003) 
; 



CREATE TABLE existing 
    (`old_column_1` int, `old_column_2` int, `new_column` varchar(4)) 
; 

INSERT INTO existing 
    (`old_column_1`, `old_column_2`, `new_column`) 
VALUES 
    (1, 100, NULL), 
    (2, 101, NULL), 
    (3, 102, NULL) 
; 

update 
existing e 
inner join (
    select * from (
    select 
    t.* 
    from temp t 
)t 
    inner join 
    (
    select 
    e.old_column_1, e.old_column_2, 
    @rownum := @rownum + 1 as rn 
    from existing e 
    , (select @rownum:=0) vars 
)e on t.id = e.rn 
) sq on sq.old_column_1 = e.old_column_1 and sq.old_column_2 = e.old_column_2 
set e.new_column = sq.new_column; 

帶電作業我在你的臨時表中增加了一個AUTO_INCREMENT列。要麼你做這種方式,或者你模擬ROWNUMBER像我一樣在這裏:

select 
    e.old_column_1, e.old_column_2, 
    @rownum := @rownum + 1 as rn 
    from existing e 
    , (select @rownum:=0) vars 

如果你想影響哪一行獲得該行號,你可以在那裏使用ORDER BY whatever_column ASC|DESC

那麼,究竟該查詢基本上沒有,就是要在現有表中創建一個行號,並通過此列,並在臨時表AUTO_INCREMENT列加入。然後,我再次將此子查詢加入到現有表中,以便我們可以輕鬆地將臨時表中的列複製到現有表中。

+0

@ rcgeorge23有沒有反饋意見? – fancyPants

+0

Hi @fancypants - 感謝您的回覆,併爲延誤表示歉意!我被拖到另一個項目上幾天了,但我今天下午會試試這個。 – rcgeorge23