MySQL为每一行自动存储日期时间
Posted
技术标签:
【中文标题】MySQL为每一行自动存储日期时间【英文标题】:MySQL auto-store datetime for each row 【发布时间】:2010-12-28 06:34:42 【问题描述】:在 mysql 中,我厌倦了将列 dt_created
和 dt_modified
(分别是创建和最后修改的日期时间戳)添加到我数据库中的所有表中。
每次我INSERT
或UPDATE
数据库时,我都必须使用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_TIMESTAMP
或 dt_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为每一行自动存储日期时间的主要内容,如果未能解决你的问题,请参考以下文章