更新条目而不更新时间戳
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 以保留某些 cron
s 的信息(它们的 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
【讨论】:
以上是关于更新条目而不更新时间戳的主要内容,如果未能解决你的问题,请参考以下文章