千家信息网

ERROR 1067 (42000): Invalid default value for 'end_time'

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,版本:mysql5.7执行sql:CREATE TABLE seckill( `seckill_id` BIGINT NOT NUll AUTO_INCREMENT COMMENT '商品库存ID'
千家信息网最后更新 2026年11月02日ERROR 1067 (42000): Invalid default value for 'end_time'

版本:mysql5.7

执行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冲突

通过执行mysql>show variables;查看explicit_defaults_for_timestamp和sql_mode变量的值

explicit_defaults_for_timestamp = OFF

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_SUBSTITUTION

分析过程:

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

重启服务器,正常执行创建语句.

属性 时间 库存 语句 办法 商品 时候 类型 原因 参数 变量 名称 情况 数量 服务器 格式 模式 版本 结果 过程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 互联网科技网 为想互联网科技怎么样 新华互联网科技学校 腾讯阿里互联网科技 深圳科技互联网 互联网 科技创业 时间互联网络科技 广州紫鲸互联网科技 华中科技有哪些互联网大佬 互联网科技实习生岗位职责 栖莱科技互联网股份有限公司 厦门比较好的科技互联网公司 青岛科技大学互联网大赛研究生 科技类公司包括互联网吗 晋城互联网科技 互联网企业科技类企业如何做账 卡尔迅互联网科技有限公司 山东大美朱楼互联网科技有限公司 互联网的黑科技实验室 百单网互联网科技有限公司怎么样 互联网科技有限公司图片 千方科技属于互联网企业吗 呼和浩特新华互联网科技学院 互联网在线教育科技创业 高科技互联网套路 四川互联网展示科技馆设计 张家口科技产业互联网平台 互联网科技创新创业项目 东风日产互联网科技公司叫什么
0