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='秒杀库存表';当我尝试使用前面的查询创建表时,我会得到以下错误:
错误1067 (42000):“end_time”的默认值无效
我怎样才能解决这个问题?
发布于 2016-09-17 12:55:53
MySQL以一种特殊的方式对待timestamp,当您不知道要寻找什么时,在文档中很难找到:
在MySQL中,时间戳数据类型在非标准方式上与其他数据类型不同:
这些非标准行为仍然是时间戳的默认行为,但从MySQL 5.6.6开始,不推荐使用这些行为,并且在启动时会出现此警告:
不建议使用隐式默认值的警告时间戳。请使用--显式_defaults_FOR时间戳服务器选项(更多细节请参见文档)。
这意味着您的第二个timestamp not null列将得到一个隐式默认值'0000-00-00 00:00:00',这与NO ZERO DATE和严格 sql模式(默认情况下在MySQL 5.7中启用)组合在一起是不允许的,并导致错误。
要解决问题,请启用选项--explicit_defaults_for_timestamp。它按照您的预期对待timestamp列(无论如何,这将是未来MySQL发行版中的默认行为),或者允许它们成为null。
发布于 2017-10-16 12:54:12
要解决你的问题:
set @@session.explicit_defaults_for_timestamp=on;https://stackoverflow.com/questions/39545124
复制相似问题