我有一张类似于
的表格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小时?
答案 0 :(得分:1)
UPDATE mytable
SET `Time` = (`Time` - INTERVAL 6 HOUR)
WHERE ID >= 2370144
AND ID <= 2373391
稍微扩展一下,在可行的情况下,我通常会运行一个SQL查询来生成一个.sql文件,每行包含一个更新语句,然后执行该sql文件来更新行。由于您只更新了大约3,000行,因此这对您来说是可行的。
这种转储和加载方法有几个好处:
以下是转储和加载方法的示例:
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;