【问题标题】:Update a field based off of the current value (in mysql)根据当前值更新字段(在 mysql 中)
【发布时间】:2011-03-15 20:15:55
【问题描述】:

我有一个类似的表

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 的值比当前值少六个小时。

我可以选择受影响的行

SELECT * FROM mytable WHERE ID >= 2370144 AND ID <= 2373391

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我认为这会奏效

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

    【讨论】:

      【解决方案2】:
      UPDATE mytable 
      SET `Time` = (`Time` - INTERVAL 6 HOUR)
      WHERE ID >= 2370144 
      AND ID <= 2373391
      

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

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

      • 您可以将 SQL 脚本另存为 您更改的内容的审核记录。
      • 您可以同时包含 ID 和时间 SQL 脚本中的值。这样如果 您不小心运行了更多脚本 比一旦你最终没有改变 值不正确。为了 例如,如果你运行我原来的 更新两次值将结束 6 小时太低了,但如果你使用 转储和加载方法并运行 脚本两次,第二次 不会更改记录,因为 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
      

      【讨论】:

      • 没有尝试您的方法,但我想它也可以。感谢您的回复。
      • 没问题。我只是稍微扩展了我的答案,以便为您提供更安全的解决方案。
      猜你喜欢
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2012-05-11
      • 1970-01-01
      • 2016-07-04
      相关资源
      最近更新 更多