2011-04-20 98 views
3

我在INSERT SELECT ON DUPLICATE KEY UPDATE查詢時遇到了一些問題。我想執行一些操作,例如爲select所返回的每個行插入的表中的字段增量,其中一些行需要更新同一行。MySQL INSERT ... SELECT ... ON DUPLICATE KEY UPDATE增量

設置:

表源

CREATE TABLE `source` (
    `key` int(11) NOT NULL AUTO_INCREMENT, 
    `data` int(11) DEFAULT NULL, 
    `state` int(11) DEFAULT NULL, 
    `group` int(11) DEFAULT NULL, 
    PRIMARY KEY (`key`) 
); 

表DEST

CREATE TABLE `dest` (
     `dkey` int(11) NOT NULL, 
     `ddata` int(11) DEFAULT NULL, 
     `dstate` int(11) NOT NULL, 
     PRIMARY KEY (`dkey`,`dstate`) 
    ) ; 

源測試值

INSERT INTO `source` (`key`,`data`,`state`,`group`) VALUES (1,1,1,1); 
INSERT INTO `source` (`key`,`data`,`state`,`group`) VALUES (2,2,2,1); 
INSERT INTO `source` (`key`,`data`,`state`,`group`) VALUES (8,4,2,1); 

查詢:

INSERT INTO `test`.`dest` (`dkey`,`ddata`,`dstate`) 
    SELECT `group`,`data`,`state` FROM `test`.`source` 
    WHERE `group` = 1 
    ON DUPLICATE KEY UPDATE 
    `ddata`= `ddata`+VALUES(`ddata`); 

我需要做的是,當該行尚未在dest存在創建一個新的行數據= 1當行已經存在,我需要它來增加數據。

執行上面的查詢後的結果是:

dkey ddata dstate 
1 1 1 
1 4 2 

在哪裏我希望他們是

1 1 1 
1 6 2 

而不是添加到以前的值,則替換它。

有什麼建議嗎?

+2

+1發佈腳本。所有這些都是@Link做的! – Quassnoi 2011-04-20 10:18:07

回答

1

重現的時候,我得到如下結果:

1, 1, 1 
1, 6, 2 

這似乎是正確的,因爲你必須爲data = 1state = 1data = 2, 4在源數據state = 2

爲什麼你會在第一條記錄中看到2

+0

我不是。我從我創建的測試數據庫複製它時犯了一個錯誤。謝謝你指出。 但是,我遇到的問題與第二行有關。謝謝@Quassnoi – Link 2011-04-20 10:58:19

+0

@Link:我無法重現該問題。你確定它不是來自測試數據庫嗎? – Quassnoi 2011-04-20 11:03:35

+0

仍然不確定問題所在,但我似乎已經修復了它。實際上這個問題似乎並不像使用INSERT SELECT UPDATE代碼,但我認爲這對我的列引用來說更是一個問題。始終使用完全限定的列名稱。 >> – Link 2011-04-20 14:32:11

相關問題