Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘online_saas.t.receive_amount’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
从异常信息可以看出,报错的原因是因为Sql语句SELECT后面的列包含了group by后面没有的列并且没有使用聚合函数。
因为近几天一直未发布,所以就问运维是不是改了MySql服务器的配置,打开了sql_mode里的only_full_group_by,导致原 需要zi料+ 绿色徽【vip1024b】
本执行正常的Sql通不过检查而执行失败。
最后运维说有台MySql服务器之前曾用Sql语句临时关闭过 only_full_group_by , 而刚刚因为负载过高自动重启了,导致sql_mode又使用了原有的默认值,而MySql 5.7以后sql_mode默认是开启only_full_group_by的,导致了该错误。
最后运维修改了这台MySql服务器的my.cnf文件,将sql_mode里的only_full_group_by关闭了,重启了MySql服务器和报错的应用,事情得以最终解决。
为啥要重启应用呢?是因为运维修改配置后,各个应用还是报错,所以重启了各个报错的应用。
2. 原因分析
假设你安装的是MySql 5.7以后的版本,比如5.7.21,默认情况下,sql_mode里的only_full_group_by是被打开的:
这个打开后,对Sql的语法检查就会很严格,就比如上面报错的Sql语句,就是因为使用GROUP BY不规范造成的。
正常情况下,我们使用GROUP BY语句都是下面这样的:
SELECT语句后的列,要么是GROUP BY语句后面出现的列,要么是使用了聚合函数。
但如果有些地方写的不规范,就会报错,比如下面这样:
因为age列既没有出现在GROUP BY语句后,也没有使用聚合函数。
但如果我们将sql_mode里的only_full_group_by关闭,上面报错的语句就不报错了:
SET @@GLOBAL.sql_mode = ‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;
最后
给大家送一个小福利
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
面试跳槽、自身职业规划迷茫的朋友们。
[外链图片转存中…(img-OSPrCK23-1710363138232)]