MySQL CURRENT_TIMESTAMP作为默认值

10 浏览
0 Comments

MySQL CURRENT_TIMESTAMP作为默认值

创建表时我遇到了以下错误:

错误 1293 (HY000):表定义不正确;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列

问题是,我实际上并没有两个带有默认值为 CURRENT_TIMESTAMPTIMESTAMP 列,也没有使用 ON UPDATE 子句。

我正在尝试执行的 DDL 查询是:

CREATE TABLE user(
    /* 基本信息 */
    id INT NOT NULL AUTO_INCREMENT,
    firstname VARCHAR(255) NOT NULL,
    surname VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    username VARCHAR(255) NOT NULL UNIQUE,
    password CHAR(40) NOT NULL,
    /* 系统状态信息 */
    active BOOL NOT NULL DEFAULT FALSE,
    validated BOOL NOT NULL DEFAULT FALSE,
    date_validated TIMESTAMP,
    date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    /* 索引 */
    PRIMARY KEY (id)
) Engine=InnoDB;

是什么导致了这个问题?

0
0 Comments

MySQL CURRENT_TIMESTAMP作为默认值的限制在MySQL 5.6.5中已经被移除,并添加了一些额外的功能。具体来说,多个TIMESTAMP和DATETIME字段可以具有自动默认值,该默认值将在INSERT操作的当前时间戳/日期时间设置字段。您可以通过设置DATETIME和TIMESTAMP数据类型来生成默认的日期和时间值,并在INSERT操作的给定行上设置当前日期和时间。或者,您可以将它们设置为ON UPDATE,在UPDATE操作中将当前日期和时间设置为字段的值。

在CREATE TABLE语句中,这两种方式如下所示:

CREATE TABLE t1 (
    ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ts2 TIMESTAMP DEFAULT NOW()
);

值得指出的是,CURRENT_TIMESTAMP是NOW()的别名。

此外,将TIMESTAMP或DATETIME字段设置为NULL将使列的默认值更改为null,而不是日期时间值。

另一个有价值的观点是,DATETIME可以包含的日期范围是1000-01-01到9999-12-31,而TIMESTAMP的范围是1970-01-01 00:00:01到2038-01-19 03:14:07。

对于DATETIME和TIMESTAMP之间的其他比较,请参阅MySQL手册页面。

可能的问题是您是否没有同时设置默认值和更新值。从提供的链接中可以了解到一些其他可能的问题和注意事项。如果我没记错的话,从5.5到5.x,生成默认值的语法可能已经发生了变化。

MySQL CURRENT_TIMESTAMP作为默认值的限制在MySQL 5.6.5中已经被移除,并添加了一些额外的功能。具体来说,多个TIMESTAMP和DATETIME字段可以具有自动默认值,该默认值将在INSERT操作的当前时间戳/日期时间设置字段。您可以通过设置DATETIME和TIMESTAMP数据类型来生成默认的日期和时间值,并在INSERT操作的给定行上设置当前日期和时间。或者,您可以将它们设置为ON UPDATE,在UPDATE操作中将当前日期和时间设置为字段的值。在CREATE TABLE语句中,这两种方式如下所示:

CREATE TABLE t1 (
    ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ts2 TIMESTAMP DEFAULT NOW()
);

值得指出的是,CURRENT_TIMESTAMP是NOW()的别名。此外,将TIMESTAMP或DATETIME字段设置为NULL将使列的默认值更改为null,而不是日期时间值。另一个有价值的观点是,DATETIME可以包含的日期范围是1000-01-01到9999-12-31,而TIMESTAMP的范围是1970-01-01 00:00:01到2038-01-19 03:14:07。对于DATETIME和TIMESTAMP之间的其他比较,请参阅MySQL手册页面。可能的问题是您是否没有同时设置默认值和更新值。从提供的链接中可以了解到一些其他可能的问题和注意事项。如果我没记错的话,从5.5到5.x,生成默认值的语法可能已经发生了变化。

0
0 Comments

MySQL CURRENT_TIMESTAMP as DEFAULT这个问题的出现的原因是MySQL只允许每个表中有一个自动更新的时间戳。虽然有一些解决方法,但并不是所有的方法都是理想的。

为了解决这个问题,我建议使用触发器来实现每个时间戳的自动更新。可以创建一个触发器,例如在customer表中:

CREATE TRIGGER customer_create BEFORE INSERT ON `customer`

FOR EACH ROW SET NEW.created_at = NOW(), NEW.updated_at = NOW();

这个触发器会在每次插入新记录之前自动将created_at和updated_at字段设置为当前时间。

关于这个问题的原因可以在stackoverflow的帖子中找到答案,该帖子引用了一个MySQL的讨论帖子:stackoverflow.com/questions/4489548/…

0
0 Comments

MySQL CURRENT_TIMESTAMP as DEFAULT问题的出现原因是默认值不起作用,需要手动设置日期。

解决方法是在插入数据时手动设置日期。

0