根据当前值更新字段(在mysql中)

时间:2011-03-15 20:15:56

标签: mysql

我有一张类似于

的表格
CREATE TABLE `mytable` (
  `ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  KEY `time` (`Time`),
) ENGINE=MyISAM AUTO_INCREMENT=2373485 DEFAULT CHARSET=latin1

我遇到了夏令时的奇怪问题,现在我需要更新ID为2370144到2373391的行,以便Time值比当前值小6小时。

我可以用

选择受影响的行
SELECT * FROM mytable WHERE ID >= 2370144 AND ID <= 2373391

如何更新这些条目,以使新时间戳比旧值小6小时?

2 个答案:

答案 0 :(得分:1)

UPDATE mytable 
SET `Time` = (`Time` - INTERVAL 6 HOUR)
WHERE ID >= 2370144 
AND ID <= 2373391

稍微扩展一下,在可行的情况下,我通常会运行一个SQL查询来生成一个.sql文件,每行包含一个更新语句,然后执行该sql文件来更新行。由于您只更新了大约3,000行,因此这对您来说是可行的。

这种转储和加载方法有几个好处:

  • 您可以将SQL脚本另存为 审核你所改变的记录。
  • 您可以同时包含ID和时间 SQL脚本中的值。那样的话 你不小心再运行脚本了 而不是一次你不会改变 不正确的价值。对于 例如,如果你运行我的原件 更新两次值将结束 6小时太低,但如果你使用的话 dump-and-load方法并运行 脚本两次,第二次 不会改变记录,因为 where子句将不再匹配。

以下是转储和加载方法的示例:

select concat('update mytable set `Time` = ''',
  `Time` - interval 6 hour,
  ''' where id = ',
  id,
  ' and `Time` = ''',
  `Time`,
  ''';') as sql_stmt
into outfile '/tmp/mytable.update.dstfix.20110315.sql'
from mytable 
WHERE ID >= 2370144 
AND ID <= 2373391;

\. /tmp/mytable.update.dstfix.20110315.sql

答案 1 :(得分:1)

我认为这会起作用

UPDATE mytable SET Time = date_sub(Time, INTERVAL 6 HOUR) WHERE id BETWEEN 2370144 AND 2373391;