版本:mysql5.7mysql
执行sql:sql
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): Invalid default value for 'end_time'服务器
缘由是:mysql5.7的explicit_defaults_for_timestamp参数默认是OFF与sql_mode的NO_ZERO_DATE冲突ide
经过执行mysql>show variables;查看explicit_defaults_for_timestamp和sql_mode变量的值spa
explicit_defaults_for_timestamp = OFFci
sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONit
分析过程:
class
1)在默认状况下,若是TIMESTAMP列没有显示的指明null属性,那么该列会被自动加上not null属性(而其余类型的列若是没有被显示的指定not null,那么是容许null值的),若是往这个列中插入null值,会自动的设置该列的值为current timestamp值。变量
2)表中的第一个TIMESTAMP列,若是没有指定null属性或者没有指定默认值,也没有指定ON UPDATE语句。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。秒杀
3)第一个TIMESTAMP列以后的其余的TIMESTAMP类型的列,若是没有指定null属性,也没有指定默认值,那么该列会被自动加上DEFAULT ‘0000-00-00 00:00:00’属性。若是insert语句中没有为该列指定值,那么该列中插入’0000-00-00 00:00:00’,而且没有warning。
解决办法:
mysql>set @@explicit_defaults_for_timestamp = 1;
1)此时若是TIMESTAMP列没有显示的指定not null属性,那么默认的该列能够为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp。
2)不会自动的为表中的第一个TIMESTAMP列加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性,除非你在建表的时候显示的指明。
3)若是TIMESTAMP列被加上了not null属性,而且没有指定默认值。这时若是向表中插入记录,可是没有给该TIMESTAMP列指定值的时候,若是strict sql_mode被指定了,那么会直接报错。若是strict sql_mode没有被指定,那么会向该列中插入’0000-00-00 00:00:00’而且产生一个warning。
NO_ZERO_DATE:
在这个模式下,不容许时间值为'0000-00-00 00:00:00'格式;
解决办法:
mysql>set @@sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
去掉NO_ZERO_IN_DATE,NO_ZERO_DATE
重启服务器,正常执行建立语句.