2014-12-03 81 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