更新条目而不更新时间戳

Posted

技术标签:

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

我在 mysql 表中有一个时间戳,属性为“ON UPDATE CURRENT_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

【讨论】:

以上是关于更新条目而不更新时间戳的主要内容,如果未能解决你的问题,请参考以下文章

使用 REPLACE INTO 更新表中的时间戳

只显示最近的猫鼬时间戳?

根据时间戳选择并用零更新时间戳

使用 touch() 更新 laravel 中自定义时间戳字段的时间戳

时间戳(自动)何时更新?

如何将 MySql 时间戳列更新为 PHP 上的当前时间戳?