由于在开发编码阶段会出现大量的空指针问题,为了减少处理空指针逻辑代码的冗余,在数据库设计阶段会给予表中字段的默认值。日期默认值也是如此,往往也可以设置默认值为
0000-00-00 00:00:00
,如下:
`ADOPT_END_TIME` timestamp(0) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '领养结束时间',
`GROWTH_START_TIME` timestamp(0) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '成长开始时间',
`GROWTH_END_TIME` timestamp(0) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '成长结束时间',
报错:
由于MySQL默认设置中不支持日期datetime格式下的
0000-00-00 00:00:00
,而在创建表的时候会报出如下错误:1067 - Invalid default value for 'ADOPT_END_TIME'
(“登录时间”的默认值无效。)
问题解决:
这个问题就出在了MySQL的配置中,因为MySQL5.7不允许datetime类型设置为
0000-00-00 00:00:00
我们可以查询MySQL的配置数据库:sql_mode
select @@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
然而我们发现这一串字符串中的NO_ZERO_IN_DATE,NO_ZERO_DATE
这两个配置限制了MySQL中datetime默认值为0,为了解决此问题,我们选择删除掉配置中的这个两个字符串。
删除配置:
- 方法1: 通过执行sql语句更改设置,执行以下sql语句修改MySQL中配置的数据库
SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SET @@sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
- 方法2: 修改磁盘中MySQL的配置文件
my.ini
,在[mysqld]
标签下添加如下信息后,重启MySQL服务。最后重新创建表即可创建成功!
sql_mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION