创建表格时出现以下错误:
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;
是什么导致了这个问题?
答案 0 :(得分:18)
您可以在一个表中使用两个时间戳。默认情况下,首先使用DEFAULT字段,然后使用其余的时间戳字段。
以下查询应该有效。
CREATE TABLE myTable
(
id INT,
date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_validated TIMESTAMP
);
答案 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();
有关详细信息,请参阅帖子本身。