MySQL 5.7升级8.0报异常:ONLY_FULL_GROUP_BY的问题解决
作者:图南随笔
异常
MySQL8.0默认的SQL模式包含了ONLY_FULL_GROUP_BY,MySQL5.7默认的SQL模式也包含了ONLY_FULL_GROUP_BY,但是MySQL5.6是不包含的,有的项目从5.6升级到5.7的时候,把SQL模式中的ONLY_FULL_GROUP_BY去掉了,再升级到8.0时,可能会报下面的异常:
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'java_test.student.subject' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY是MySQL的一个SQL模式,它要求在使用GROUP BY语句时,SELECT列表、HAVING条件或ORDER BY列表中的每个列,要么是聚合函数的一部分(如COUNT(), SUM(), AVG()等),要么必须在GROUP BY子句中明确指定。这一模式的设计初衷是增强查询的准确性和可预测性,避免因为列的不明确引用而导致的数据错误或不一致。
异常解决
假设我们有一张student表,包含name(姓名)、subject(科目)、score(分数)三个字段,在ONLY_FULL_GROUP_BY启用时,我们尝试运行如下查询,就会报上面的异常:
select name, subject, score from student group by name
解决方法有两个:
1、修改sql
使用聚合函数处理非GROUP BY列,或将其加入到GROUP BY子句中,常见的聚合函数包括SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值)、COUNT(计数)等。
select name, subject, sum(score) from student group by name, subject
2、修改sql_mode
1)修改当前会话的sql_mode
查看当前会话的sql_mode:
select @@sql_mode; 或者 select @@session.sql_mode;
修改当前会话的sql_mode:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 或者 SET session sql_mode=(SELECT REPLACE(@@session.sql_mode,'ONLY_FULL_GROUP_BY',''));
2)修改全局配置的sql_mode
查看全局配置的sql_mode:
select @@global.sql_mode;
修改全局配置的sql_mode:
SET global sql_mode=(SELECT REPLACE(@@global.sql_mode,'ONLY_FULL_GROUP_BY',''));
3)永久修改sql_mode
若想永久修改sql_mode,需要修改MySQL配置文件(my.cnf或my.ini)
A、打开MySQL配置文件,具体路径根据安装方式和操作系统不同,通常位于:
Linux: /etc/my.cnf 或 /etc/mysql/my.cnf
Windows: C:\ProgramData\MySQL\MySQL Server X.Y\my.ini
使用文本编辑器打开文件
B、找到[mysqld]部分,添加或修改如下行:
[mysqld] sql_mode=新模式
将新模式替换为你希望设置的值
MySQL配置文件的修改,重启MySQL服务后才能生效。
注:
1)建议写sql时尽量规范,在使用GROUP BY语句时,SELECT列表、HAVING条件或ORDER BY列表中的每个列,要么是聚合函数的一部分(如COUNT(), SUM(), AVG()等),要么必须在GROUP BY子句中明确指定。
2)当我们需要修改sql_mode时,一般情况下,先修改全局配置,再修改配置文件,这样修改后,即使MySQL服务重启后sql_mode也是最新的。
到此这篇关于MySQL 5.7升级8.0报异常:ONLY_FULL_GROUP_BY的问题解决的文章就介绍到这了,更多相关MySQL 5.7升级8.0报异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!