错误1067(42000):'end_time'的默认值无效

时间:2016-09-17 09:24:24

标签: mysql

CREATE TABLE seckill (
  `seckill_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
  `name` VARCHAR(120) NOT NULL COMMENT '商品名称',
  `number` INT NOT NULL COMMENT '库存数量',
  `start_time` TIMESTAMP NOT NULL COMMENT '开始时间',
  `end_time` TIMESTAMP NOT NULL COMMENT '结束时间',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (seckill_id),
  KEY idx_start_time(start_time),
  KEY idx_end_time(end_time),
  KEY idx_create_time(create_time)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒杀库存表';

当我尝试使用上一个查询创建表时,这是我得到的错误:

  

ERROR 1067(42000):'end_time'

的默认值无效

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

MySQL以特殊的方式对待timestamp,当您不知道自己在寻找什么时,documentation会很难找到它:

  

在MySQL中,TIMESTAMP数据类型以非标准方式与其他数据类型不同:

     
      
  • 未使用NULL属性显式声明的TIMESTAMP列被赋予NOT NULL属性。 (其他数据类型的列,如果未显式声明为NOT NULL,则允许NULL值。)将此列设置为NULL会将其设置为当前时间戳。

  •   
  • 表中的第一个TIMESTAMP列,如果未使用NULL属性或显式DEFAULT或ON UPDATE子句声明,则会自动分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。

  •   
  • 第一个后面的TIMESTAMP列,如果没有使用NULL属性或显式DEFAULT子句声明,则会自动分配DEFAULT'0000- 00:00:00'(“零”时间戳)。对于未为此类列指定显式值的插入行,将为该列分配“0000-00-00 00:00:00”并且不会发出警告。

  •   
     

这些非标准行为仍然是TIMESTAMP的默认行为,但不推荐使用MySQL 5.6.6,并且在启动时出现此警告:

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option 
(see documentation for more details).

这意味着您的第二个timestamp not null列将获得隐式默认值'0000-00-00 00:00:00',这不允许与NO ZERO DATEstrict sql模式结合使用(这是默认情况下在MySQL 5.7中启用并导致错误。

要解决您的问题,请启用选项--explicit_defaults_for_timestamp。它按预期处理timestamp列(无论如何将成为未来MySQL版本中的默认行为),或允许它们为null

答案 1 :(得分:0)

解决您的问题:

set @@session.explicit_defaults_for_timestamp=on;