MySQL为每一行自动存储日期时间

Posted

技术标签:

【中文标题】MySQL为每一行自动存储日期时间【英文标题】:MySQL auto-store datetime for each row 【发布时间】:2010-12-28 06:34:42 【问题描述】:

mysql 中,我厌倦了将列 dt_createddt_modified(分别是创建和最后修改的日期时间戳)添加到我数据库中的所有表中。

每次我INSERTUPDATE 数据库时,我都必须使用NOW() 关键字。这就是我的坚持。

是否有任何有效的替代方案,让 MySQL 至少可以自动存储插入行的数据时间并让我检索它?

【问题讨论】:

我糟糕的语法潜伏在 Stack Overflow 的黑暗深处。谢谢@Eric Leschinski。 【参考方案1】:

您可以使用 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 properties

【讨论】:

啊我不知道你可以使用类似ON UPDATE CURRENT_TIMESTAMP 附加信息: 表中的一个 TIMESTAMP 列可以将当前时间戳作为初始化该列的默认值、作为自动更新值,或两者兼而有之。不可能将当前时间戳设为一列的默认值,而将另一列的自动更新值设为默认值。 dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html DEFAULT ON UPDATE CURRENT_TIMESTAMP 不是有效的 SQL。它必须是 dt_modified datetime ON UPDATE CURRENT_TIMESTAMPdt_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 如果您仍然声称它是有效的,那么可能是 MySQL Workbench 存在问题,应该提及。【参考方案2】:

如果您使用的是 phpmyadmin,您可以这样做:

【讨论】:

【参考方案3】:
ALTER TABLE  `tablename` CHANGE  `dt`  `dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

应该是正确的代码。

【讨论】:

【参考方案4】:

好吧,你不能两者兼得:

mysql doc:

不能让当前时间戳成为一列的默认值,而另一列的自动更新值。

伤心,不是吗?

你可以使用 null 而不是 now() following this tip

【讨论】:

【参考方案5】:

这里提出了类似的问题“Timestamp for MySQL”,时间戳字段将在每次访问时更新。您还可以考虑将Trigger 放在相关表格上,以自动为您填充这些字段。根据环境,一些商店/企业不喜欢使用触发器,因此您可能不得不寻找替代解决方法。

【讨论】:

【参考方案6】:

phpmyadmin 你可以设置

或 使用这个查询

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

【讨论】:

【参考方案7】:

可以在更新行时设置为默认值

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

【讨论】:

以上是关于MySQL为每一行自动存储日期时间的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 生成日期表

使用存储过程将自动日期字段添加到 MYSQL 数据库

将mysql时间戳转换为实际日期和时间?

仅在 MySQL 列中自动标记日期

MySQL 日期时间与前一行的比较

如何使用 JPA 将 Java 日期存储到 Mysql 日期时间