创建和更新时的MySQL CURRENT_TIMESTAMP

时间:2011-02-04 10:35:24

标签: mysql timestamp mysql-error-1293

我想定义具有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_createts_update的所需行为。

9 个答案:

答案 0 :(得分:54)

这是mySQL的限制,你不能有两个TIMESTAMP列,其默认值引用CURRENT_TIMESTAMP。唯一的方法是对ts_create使用DATETIME类型,遗憾的是它不能具有默认值NOW()。你可以使用自己的触发器来实现这一目标。

答案 1 :(得分:13)

猜猜这是一个老帖子,但实际上我猜mysql在其最新版本的mysql 5.6.25中支持2个TIMESTAMP,这就是我现在使用的内容。

答案 2 :(得分:5)

您使用的是较旧的MySql版本。将myqsl更新为5.6.5+它将起作用。

答案 3 :(得分: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

答案 4 :(得分:1)

您的表上不能有两个TIMESTAMP列,其默认值为CURRENT_TIMESTAMP。请参阅此链接:http://www.mysqltutorial.org/mysql-timestamp.aspx

答案 5 :(得分:0)

我想你可能希望ts_create为datetime(所以重命名 - > dt_create)并且只将ts_update作为时间戳?这将确保它一旦设置就保持不变。

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

答案 6 :(得分:0)

我会说你不需要在ts_update上使用DEFAULT CURRENT_TIMESTAMP:如果它是空的,那么它就不会更新,所以你的'last update'是ts_create。

答案 7 :(得分:0)

这是旧版本中Mysql的一个微小限制,实际上是在5.6及更高版本之后多个时间戳工作...

答案 8 :(得分:0)

你可以试试这个     ts_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP,     更新CURRENT_TIMESTAMP上的ts_update TIMESTAMP DEFAULT NULL