每行MySQL自动存储日期时间

60
在MySQL中,我厌倦了在数据库中的所有表格中添加dt_createddt_modified这两列(它们分别是创建和上次修改的日期时间戳)。
每次我执行INSERTUPDATE操作时,我都需要使用NOW()关键字。这让我非常困扰。
有没有一种高效的替代方案,可以让MySQL自动存储插入行的日期时间,并让我检索出来呢?

1
我的语法不好,在Stack Overflow的黑暗深处潜伏着。谢谢@Eric Leschinski。 - mauris
7个回答

112

您可以使用DEFAULT约束来设置时间戳:

ALTER TABLE
 MODIFY dt_created datetime DEFAULT CURRENT_TIMESTAMP

ALTER TABLE
 MODIFY dt_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

那么在INSERT/UPDATE语句中就不需要指定NOW()了。

参考文献:TIMESTAMP属性


啊,我不知道你可以使用类似于 ON UPDATE CURRENT_TIMESTAMP 的东西。 - mauris
4
一张表中的一个 TIMESTAMP 列可以将当前时间戳作为默认值来初始化该列,也可以将其作为自动更新值,或者两者兼备。不可能让当前时间戳既是一列的默认值又是另一列的自动更新值。http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html - alditis
7
"DEFAULT ON UPDATE CURRENT_TIMESTAMP" 不是有效的SQL语句。它必须是 "dt_modified datetime ON UPDATE CURRENT_TIMESTAMP" 或者 "dt_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"。如果您仍然认为它是有效的,请注意可能是MySQL Workbench存在问题。 - James Wilkins

15
如果您正在使用phpmyadmin,则可以通过以下方式实现:

输入图像描述


11
ALTER TABLE  `tablename` CHANGE  `dt`  `dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

应该是正确的代码。


3

很遗憾,以下两个条件无法同时满足:

mysql文档:

不可能将当前时间戳作为一个列的默认值,并将其设置为另一个列的自动更新值。

是不是非常遗憾呢?

不过,你可以使用null代替now(),可以参考这个提示


1

类似的问题在这里被问到 "MySQL时间戳" 时间戳字段将在每次访问时更新。您还可以考虑在相关表上放置触发器,以自动为您填充这些字段。根据环境,有些商店/企业不喜欢使用触发器,因此您可能需要找到替代方法。


0

可以将其设置为默认值,并在行更新时进行更新

ALTER TABLE `tablename` CHANGE `dt` `dt` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

0
在phpmyadmin中,您可以设置 enter image description here

或者使用以下查询

ALTER TABLE  `tablename`
    CHANGE  `dt_created`  `dt_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接