创建和更新时的MySQL CURRENT_TIMESTAMP


68

我想定义具有2个TIMESTAMP字段的表,如下所示:

CREATE TABLE `msgs` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `msg` VARCHAR(256),
    `ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

如何避免错误:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

重点是保持表架构中ts_create和的所需行为ts_update


1
我相信错误很明显,您寻求的是使用替代方法来做类似current_timestamp的操作
GusDeCooL 2012年

1
使用最新版本的MySQL(5.6.5+),它应该适合您!
Amol Fasale

Answers:


18

猜猜这是一个老帖子,但实际上我想mysql在其最新版本中支持2 TIMESTAMP mysql 5.6.25,这就是即时通讯所使用的时间。


5

您正在使用旧版本的MySql。将您的myqsl更新到5.6.5+,它将起作用。


问题是从2011年开始的,那时MySQL 5是全新的。
古巴

2

我认为可以通过使用以下技术

`ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

“ 0000-00-00 00:00:00”不是有效的时间戳,尽管mysql允许,但许多其他数据库不允许将“ 0000-00-00 00:00:00”作为默认的时间戳数据类型,因此在特定时间,如果您要从mysql迁移过来,这将很痛苦。
imVJ

这在MySQL中实际上也很痛苦,您不应该使用零来初始化时间戳或日期/时间列。
大卫·瓦塔尼亚

是否允许零作为有效时间戳取决于当前的SQL模式。文档:dev.mysql.com/doc/refman/5.5/en/...
alexg


0

我认为您可能想将ts_create作为日期时间(因此重命名-> dt_create),而仅将ts_update作为时间戳?这样可以确保设置后保持不变。

我的理解是datetime是用于手动控制的值,而timestamp有点“特殊”,因为MySQL会为您维护它。因此,在这种情况下,datetime是ts_create的不错选择。


0

我会说您不需要在ts_update上安装DEFAULT CURRENT_TIMESTAMP:如果为空,则不会更新,因此您的“最后更新”是ts_create。


如果您在DEFAULT中有另一个带有TIMESTAMP的字段,则不能具有ON UPDATE TIMESTAMP
Jeger,2012年

我知道。但是问题不是“为什么会发生”,而是“我如何避免这种情况”。我相信这会更好地回答这个问题,然后“更改数据类型并触发”。
Nanne


0

您可以尝试使用 ts_createTIMESTAMP DEFAULT CURRENT_TIMESTAMP, ts_updateTIMESTAMP DEFAULT NULL启用UPDATE CURRENT_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.