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'
的默认值无效
我该如何解决这个问题?
答案 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 DATE
和strict sql模式结合使用(这是默认情况下在MySQL 5.7中启用并导致错误。
要解决您的问题,请启用选项--explicit_defaults_for_timestamp
。它按预期处理timestamp
列(无论如何将成为未来MySQL版本中的默认行为),或允许它们为null
。
答案 1 :(得分:0)
解决您的问题:
set @@session.explicit_defaults_for_timestamp=on;