2012-06-27 64 views
13

我有一個表(name, date, stat1, stat2, stat3),(name, date)是PK。當我插入行時,會有重複的鍵,我需要總結三個統計。我在Java中用PreparedStatement使用以下查詢:MySQL插入行重複鍵更新多列

INSERT INTO tb (name, date, stat1, stat2, stat3) 
VALUES (?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE stat1 = stat1 + ?, stat2 = stat2 + ?, stat3 = stat3 + ? 

是否有更簡潔的查詢來實現該目的?因爲我簡化了查詢,那裏有十多個統計數據。

回答

26
INSERT INTO tb (name, date, stat1, stat2, stat3) 
VALUES (?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE stat1 = stat1 + VALUES(stat1), stat2 = stat2 + VALUES(stat2), stat3 = stat3 + VALUES(stat3) 
+1

這樣比較好。但是否有可能我不需要重複每個屬性? – DrXCheng

+1

可悲的是,沒有元語法,只有枚舉是可能的 – vearutop

+0

我看到這是一個老問題,但另一種選擇是寫一個字符串統計過程,然後通過它們循環(分裂後)。可能不會少代碼,但會更具活力。 – inarilo

0

添加一個計算列(總和)並將其包含在您的PK中。

但是,這會使您的表非規範化。你可以使用一個代理鍵,並在做計算你的SELECT

-2

如果你指定ON DUPLICATE KEY UPDATE,行插入,將導致在一個唯一索引或主鍵的重複值時,MySQL執行舊行的更新。例如,如果列中的被聲明爲UNIQUE和包含值1,下列兩個語句具有類似的效果:

INSERT INTO表(A,B,C)VALUES(1,2,3) ON DUPLICATE KEY UPDATE c = c + 1;

等效更新查詢是如下,

UPDATE SET表C = C + 1其中a = 1;

如果a和b列是唯一的,相當於更新查詢將是,

UPDATE SET表C = C + 1其中a = 1 OR B = 2 LIMIT 1;

+0

你已經發布了相同的答案[這裏](http://stackoverflow.com/questions/20672203/insert-or-if-column-combination-exists-update/20674595#20674595)。如果您覺得此問題類似,請將其標記爲重複。 –