mysql建表报错:invalid default value for 'date'的解决方法
作者:我爱Java,Java万岁
问题描述
在执行sql建表脚本时,出现了“invalid default value for ‘end_date’ ”错误,导致脚本执行失败。
执行的sql语句
CREATE TABLE `tb_task_site` ( `id` varchar(40) NOT NULL COMMENT 'id', `start_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '同步开始时间', `end_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '同步结束时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
错误提示
原因解析
mysql5.7对sql_mode的设置比mysql5.6更严格了,mysql5.6默认的sql_mode:
NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
mysql5.7默认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 两个参数使得时间或日期参数 不得 使用0作默认值,也就是上面的sql中 “default ‘0000-00-00 00:00:00’ ”是不被允许的,所以导致该错误提示。
可以通过 select @@sql_mode; 查看自己的mysql设置的sql_mode的值。
sql_mode 使得 sql 语句更严谨,但是又会带来老版本的不兼容问题,所以可以设置sql_mode的值使得新版本兼容老版本的sql脚本。
解决方案
既然是那两个sql_mode参数导致的问题,那就将两个参数去掉就好了。在默认的sql_mode参数去除,只剩下:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
上面参数只是例子,具体设置参数值按照项目要求。
解决方法有如下几种:
1、暂时解决方案,可以在该会话(session)中暂时修改其sql_mode参数,但是会话结束,下一次会话,修改的参数就失效,变为原来的参数。
set SQL_MODE = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
执行完之后就可以继续执行建表语句,但是重启mysql后再执行建表语句的话依旧会报错。
2、永久解决方案,可以通过执行sql方式,设置全局sql_mode参数,设置后效果永久生效。
set GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
3、永久解决方案,直接修改配置文件,windows系统的话是my.ini文件,linux的话是my.cnf文件。有sql_mode的设置就修改,没有就添加sql_mode:
然后重启mysql,例如linux下执行mysql重启命令:
systemctl restart mysqld
总结
到此这篇关于mysql建表报错:invalid default value for 'date'解决的文章就介绍到这了,更多相关mysql invalid default value for 'date'内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!