33

创建表时出现以下错误:

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

问题是我实际上没有默认的两列,我也没有使用TIMESTAMP子句。CURRENT_TIMESTAMPON 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;

是什么导致了这个问题?

4

3 回答 3

37

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

下面的查询应该可以工作。

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

在 sqlfiddle 演示

于 2012-07-09T17:56:41.447 回答
9

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

更多细节
此外,准确了解如何生成默认日期和时间值可能很有价值。
如以下链接中所述,您可以同时设置 DATETIME 和 TIMESTAMP 数据类型,因此该列将具有给定行的 INSERT 操作的当前日期和时间的 DEFAULT 值。或者,您可以将它们设置为 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 和 TIMESTAMP 之间的其他比较,请阅读比较它们的MySQL 手册页。

于 2014-09-30T09:38:30.673 回答
2

请允许我引用我自己的博客文章:“无论出于何种原因,MySQL 只允许每个表有一个自动更新时间戳。有很多方法可以解决这个问题,但并非所有方法都不糟糕。”

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

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

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

于 2012-07-09T17:38:34.883 回答