MySQL CURRENT_TIMESTAMP为DEFAULT

时间:2012-07-09 17:34:11

标签: mysql

创建表格时出现以下错误:

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

问题在于我实际上没有两列TIMESTAMP默认为CURRENT_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;

是什么导致了这个问题?

3 个答案:

答案 0 :(得分:18)

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

以下查询应该有效。

CREATE TABLE myTable 
(
 id INT,
 date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
 date_validated TIMESTAMP
);

Demo at sqlfiddle

答案 1 :(得分:8)

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

更多细节
此外,准确了解如何生成默认日期&amp;时间价值。
如下面的链接所示,您可以同时设置DATETIME&amp; 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()
);

值得指出的是,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和DATETIME之间的进一步比较TIMESTAMP阅读this MySQL manual page比较它们。

答案 2 :(得分:2)

请允许我引用my own blog post:“MySQL,无论出于何种原因,每个表只允许一个自动更新时间戳。有很多方法可以解决这个问题,但并非所有方法都不吸引人。”

我建议的方法是为每个时间戳使用触发器:

CREATE TRIGGER customer_create BEFORE INSERT ON `customer`
FOR EACH ROW SET NEW.created_at = NOW(), NEW.updated_at = NOW();

有关详细信息,请参阅帖子本身。