更新条目而不更新时间戳


76

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

Answers:


47

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

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

DEFAULT CURRENT_TIMESTAMP

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


1
您能显示一个SQL语句来为其他人更新该字段吗,我自己发现了吗?
一个编码器

如果我想像往常一样更新last_updated字段(保持ON UPDATE CURRENT_TIMESTAMP行为)怎么办,除非仅在一个特定的列上进行更新?实际上,我正在对元数据数据库进行建模以保留某些crons的信息(它们的源,接收器,last_completion_time)。因此,last_updated只有在实际修改了cron时,才必须更新该字段(而不是在cron的last_completion_time字段被更新时)
y2k-shubham

143

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

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

如果您未在查询中设置值,则将根据表定义将其更新为当前时间戳。


13
“慢”-多少?是否比OP删除魔术ON UPDATE,添加NOW()所有其他查询并重新测试他的应用所需的时间还长?
Andy 2012年

慢多少取决于您要更新的行数。如果您正在使用具有数百万行的系统日志,则不仅速度很慢-每次运行该查询时速度也很慢。我并不是在建议去除DEFAULT价值。只是ON UPDATE
Mikhail

2
谢谢,这正是我所需要的。我有表“ blogposts”,当我更新视图计数时,它会更新“ datetime_edited”(按更新时间戳记)列。在其他每一种情况,我需要“datetime_edited”字段更新-标题或描述的变化,新的图片上传等
fsasvari

2
我希望我可以不止一次投票!我什至不知道您可以在更新语句中引用记录中的列!一个全新的世界!
萨姆森

谢谢,这是我需要的出色解决方案。推荐。
PiotrStępniewski17年

24

要使表/时间戳自动更新:

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;

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


9

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

如果您确实要更新记录而不更新,请使用时间戳记:

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

13
“不使用时间戳”,为什么?
Petah

4
它们只能代表从1.1.1970到31.12.2037的时间;仅第一个时间戳列会自动更新;从备份时间戳还原时,时间戳会调整为本地时区。并且,根据您的应用程序,您可能不希望在后台运行sql update语句时更新该列(您只希望在使用前端编辑数据时更新时间戳记)
knittl 2014年

时间戳明确旨在跟踪PRESENT时间,因此它的值范围有限不会有问题。“仅第一列”也不是问题,并且假设您至少使用MySQL 4.1.3,那么如果使用mysqldump进行备份,则本地时区也不是问题。
AnrDaemon

1
除了@AnrDaemon所说的,我敢肯定,在我们接近截止日期之前,我们将获得对2037年以后日期范围的支持,并且将历史数据转换为新的时间戳格式应该非常容易(如果不是自动的话)。此外,至少自2013年初发布v5.6.10以来,MySQL至少已支持多个时间戳列。并且,如果您不希望在更新记录时更新时间戳值,则不要指定ON UPDATE ...
nextgentech

0

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

SET LastUpdatedDate=NOW() WHERE

这个想法来自这里: 触摸MYSQL记录以更新TIMESTAMP字段

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.