我有下面的sql创建语句
mysql> CREATE TABLE IF NOT EXISTS `erp`.`je_menus` (
-> `id` INT(11) NOT NULL AUTO_INCREMENT ,
-> `name` VARCHAR(100) NOT NULL ,
-> `description` VARCHAR(255) NOT NULL ,
-> `live_start_date` DATETIME NULL DEFAULT NULL ,
-> `live_end_date` DATETIME NULL DEFAULT NULL ,
-> `notes` VARCHAR(255) NULL ,
-> `create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
-> `created_by` INT(11) NOT NULL ,
-> `update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
-> `updated_by` INT(11) NOT NULL ,
-> `status` VARCHAR(45) NOT NULL ,
-> PRIMARY KEY (`id`) )
-> ENGINE = InnoDB;
给出以下错误
错误1067 (42000):'create_date'的默认值无效
这里的误差是多少?
时间戳的范围是'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC(见文档)。默认值必须在该范围内。
其他奇怪的相关行为:
CREATE TABLE tbl1 (
ts TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)
CREATE TABLE tbl2 (
ts TIMESTAMP,
ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'
CREATE TABLE tbl3 (
ts TIMESTAMP,
ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)
旁注,如果你想插入null:
CREATE TABLE tbl4 (
ts TIMESTAMP NULL DEFAULT NULL);
我很惊讶看到这么多答案,但没有人指出主要原因:不正确的“零”日期格式。简而言之,只需使用'0000-01-01 00:00:00'而不是'0000-00-00 00:00:00'。月00和日00显然都不是有效值。
我同意顶级用户的意见,这个错误是由MySQL设置NO_ZERO_DATE引起的。这个设置是在新的MySQL服务器版本中引入的,默认启用,这让许多开发人员感到惊讶。但是请注意,这种设置的主要目的并不是让开发人员的工作更困难,而是迫使他们修正过时的表结构,并避免在将来使用这种不正确的数据结构格式。
因此,如果您正在创建新表并希望指定“ZERO”日期,请使用'0000-01-01 00:00:00'。
如果你已经创建了表并得到了这个错误(例如,在插入新记录时忽略了默认值),只需像这样更新你的表:
ALTER TABLE `erp`.`je_menus`
MODIFY COLUMN `create_date` datetime(0) NOT NULL DEFAULT '0000-01-01 00:00:00' AFTER `notes`;
删除上述服务器设置只是暂时的解决方案,并不是一个良好实践的例子。