MySQL CURRENT_TIMESTAMP为DEFAULT

Bar*_*tak 15 mysql

在创建表时,我收到以下错误:

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

问题是,我实际上没有两列TIMESTAMPCURRENT_TIMESTAMP为默认值,无论我使用ON UPDATE条款.

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

CREATE TABLE user(
    /* Basic Information */
    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,

    /* System status information */
    active BOOL NOT NULL DEFAULT FALSE,
    validated BOOL NOT NULL DEFAULT FALSE,
    date_validated TIMESTAMP,
    date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    /* Index */
    PRIMARY KEY (id)
) Engine=InnoDB;
Run Code Online (Sandbox Code Playgroud)

是什么导致了这个问题?

Fah*_*kar 18

您可以在一个表中使用两个时间戳.默认情况下,首先使用DEFAULT字段,然后使用其余时间戳字段.

下面的查询应该工作.

CREATE TABLE myTable 
(
 id INT,
 date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
 date_validated TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

在sqlfiddle演示


MER*_*MER 8

我认为重要的是要注意到MySQL 5.6.5中不再存在此限制.该限制已被删除,并添加了一些其他功能.具体来说:多个TIMESTAMP以及DATETIME字段可以具有自动默认值,该字段将字段设置为当前时间戳/日期时间,如以下博客文章中所述(显然由进行修复的人员编写):http:// optimize- this.blogspot.com/2012/04/datetime-default-now-finally-available.html

更多细节
此外,了解如何生成默认日期和时间值可能很有价值.
如下面的链接所示,您可以设置DATETIME和TIMESTAMP数据类型,以便该列具有DEFAULT值,该值是给定行的INSERT操作的当前日期和时间.或者,您可以将它们设置为ON UPDATE,以便在UPDATE操作的字段中设置当前日期和时间.
链接:http:
//dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

以下是CREATE TABLE语句中的两种情况:

CREATE TABLE t1 (
ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
,ts2 TIMESTAMP DEFAULT NOW()
);
Run Code Online (Sandbox Code Playgroud)

值得指出的是,CURRENT_TIMESTAMP是NOW()的别名.
此外,将TIMESTAMP或DATETIME字段设置为NULL会将列DEFAULT更改为null而不是日期时间值(再次参见链接了解详细信息和更多详细信息).
另一个有价值的观点是DATETIME可以包含以下日期范围:
1000-01-01到9999-12-31,
而TIMESTAMP的范围是:
1970-01-01 00:00:01到2038-01-19 03: 14:07
有关DATETIME和TIMESTAMP之间的其他比较,请阅读此MySQL手册页以进行比较.