【问题标题】:Updating entry WITHOUT updating timestamp更新条目而不更新时间戳
【发布时间】:2011-02-20 03:40:09
【问题描述】:

我在 mysql 表中有一个时间戳,属性为“ON UPDATE CURRENT_TIMESTAMP”。有没有办法在特殊场合手动禁用更新时间戳? (例如:更新条目以修改博客文章,但不重新日期)

【问题讨论】:

    标签: mysql sql timestamp


    【解决方案1】:

    您可以在更新命令中手动将列的值设置为其当前值:

    UPDATE table SET x=y, timestampColumn=timestampColumn WHERE a=b;
    

    如果你没有在查询中设置值,它将根据表定义更新为当前时间戳。

    【讨论】:

    • “较慢” - 多少?比 OP 移除魔法 ON UPDATE、将 NOW() 添加到他的所有其他查询并重新测试他的应用程序所需的时间更长?
    • 慢多少取决于您要更新的行数。如果您正在使用具有数百万行的系统日志,那么它不仅很慢 - 每次运行该查询时都会很慢。我不建议删除DEFAULT 值;只是ON UPDATE
    • 谢谢,这正是我所需要的。我有表“blogposts”,当我更新视图计数时,它会更新“datetime_edited”(更新时间戳)列。在其他情况下,我需要更新“datetime_edited”字段 - 标题或描述更改、新图片上传等。
    • 我希望我能多次投票!我什至不知道您可以在更新语句中引用记录中的列!一个全新的世界!
    • 谢谢,这是一个很好的解决方案,正是我所需要的。推荐。
    【解决方案2】:

    有没有办法在特殊情况下手动禁用更新时间戳? (例如:更新条目以修改博客文章,但不重新日期)

    听起来您需要配置默认约束,以便它仅在插入时填充列:

    DEFAULT CURRENT_TIMESTAMP
    

    将其更改为 only 意味着任何修订都不会触发时间戳值的更新。 IE:如果您昨天创建了博文,并在今天更正了一个错字 - 列中的日期仍然是昨天的。

    【讨论】:

    • 你能不能给别人显示一个更新字段的SQL语句,我自己想出来的?
    • 如果我想像往常一样更新last_updated 字段(保持ON UPDATE CURRENT_TIMESTAMP 行为)除非仅在一个特定列上进行更新?实际上我正在建模一个 meta-data db 以保留某些 crons 的信息(它们的 source、sink、last_completion_time)。所以我last_updated字段只有在cron被实际修改时才需要更新(而不是在cron的last_completion_time字段被更新时)
    【解决方案3】:

    让您的表/时间戳自动更新:

    ALTER TABLE myTable
    CHANGE myTimestampColumn
            myTimestampColumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;
    

    让它自动更新:

    ALTER TABLE myTable
    CHANGE myTimestampColumn
            myTimestampColumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP;
    

    注意:“default current_timestamp”部分只是将其设置为默认时间的当前时间戳,因为该字段不为空。如果您愿意,您可以同时删除 not null 和默认值。

    【讨论】:

      【解决方案4】:

      不要使用时间戳,而是手动跟踪时间。

      如果您真的想更新记录并且不更新它的时间戳,请使用:

      UPDATE `table` SET `timestamp` = `timestamp`, `col` = 'new data' …;
      

      【讨论】:

      • “不要使用时间戳”,为什么?
      • 它们只能表示从 1.1.1970 到 31.12.2037 的时间;只有第一个时间戳列会自动更新;从备份还原时,时间戳会调整为本地时区。而且,根据您的应用程序,您可能不希望在后台运行 sql 更新语句时更新该列(您只希望在使用前端编辑数据时更新时间戳)
      • 时间戳明确用于跟踪 PRESENT 时间,因此它的值范围有限没有问题。 “仅第一列”也不是问题,并且假设您至少使用 MySQL 4.1.3,如果您使用 mysqldump 进行备份,则本地时区不是问题。
      • 除了@AnrDaemon 声明的内容之外,我相信我们会在接近截止日期之前很久就获得对 2037 年以后日期范围的支持,并且将历史数据转换为新的时间戳格式应该非常容易(如果不是自动的)。此外,至少自 2013 年初发布 v5.6.10 以来,MySQL 已经支持多个时间戳列。如果您不希望在更新记录时更新时间戳值,则不要指定 ON UPDATE...跨度>
      【解决方案5】:

      如果您确实在更新时更改了时间,那么您必须考虑到如果值已更新但未更改(更新了保存值),那么它不会更新“更新 Current_timestemp”,在这种情况下您应该手动设置时间

      SET LastUpdatedDate=NOW() WHERE
      

      这个想法来自这里: Touch MYSQL record to update TIMESTAMP field

      【讨论】:

        猜你喜欢
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        相关资源
        最近更新 更多