MySQL CURRENT_TIMESTAMP作为默认值
MySQL CURRENT_TIMESTAMP作为默认值
创建表时我遇到了以下错误:
错误 1293 (HY000):表定义不正确;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列
问题是,我实际上并没有两个带有默认值为 CURRENT_TIMESTAMP
的 TIMESTAMP
列,也没有使用 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;
是什么导致了这个问题?
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,生成默认值的语法可能已经发生了变化。
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/…