2014-12-03 77 views
0

我有一個大量的DATETIME記錄計算TIMEDIFF更新查詢:MYSQL:如何更新多個列具有相同的值

UPDATE eventlog SET downtime = TIMEDIFF(up_stamp,down_stamp);

這工作,但我需要設置這個TIMEDIFF值到另一列以及downtime。像這樣的事情(不工作):

UPDATE eventlog SET downtime, downtime_adj = TIMEDIFF(up_stamp,down_stamp);

我知道我可以像這樣將它們組合起來:

UPDATE eventlog SET downtime = TIMEDIFF(up_stamp,down_stamp), downtime_adj = TIMEDIFF(up_stamp,down_stamp);

但是,這將重新計算,同時DIFF 2X多次需要。什麼是最有效的方式來做到這一點?

回答

2

看起來有可能使用用戶定義的變量,因此TIMEDIFF()不需要運行兩次。

試試這個:

UPDATE eventlog SET downtime = @x := TIMEDIFF(up_stamp,down_stamp), downtime_adj = @x; 

下面是文檔:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

免責聲明:

我剛好看到你的問題後,閱讀起來。我不擅長SQL。

希望幫助:-)

+0

此解決方案是否阻止@ a1ex07提出的可能的左右評估問題?我發現了另一個例子:http://bugs.mysql.com/bug.php?id=52861。 – kiwisan 2014-12-03 19:46:50

+0

從文檔:「作爲一般規則,除了在SET語句中,_you不應該爲用戶變量賦值並讀取同一語句中的值。」還有,「對於其他語句,如SELECT,你可能會得到你期望的結果,但是這並不能保證。「 – cepradeep 2014-12-04 02:45:03

+1

也就是說,這個特殊的陳述似乎是從」Maria-DB 5.5.36「中的從左到右的評估。例如,類似'UPDATE eventlog SET downtime = @x,downtime_adj = @x:= TIMEDIFF(up_stamp,down_stamp)'的結果是'downtime'列的'NULL'值。我會說沒有未定義的行爲(我知道)。最好的選擇是在你的數據庫上測試它。 – cepradeep 2014-12-04 02:55:26

1

我只是測試這一點,它似乎對我的MySQL工作:

UPDATE eventlog SET downtime = TIMEDIFF(up_stamp,down_stamp), downtime_adj = downtime; 

downtime將與timeDiff測量設置和downtime_adj將使用新的downtime,因爲它的價值。

+0

文件說,「單表更新的任務一般是從左至右評估。」(http://dev.mysql.com/doc/refman/5.5/en/update.html )。就我個人而言,我不會冒險,並假設「一般」的意思是「始終」...... – a1ex07 2014-12-03 18:22:55