当前位置: 代码网 > it编程>数据库>Mysql > MySQL 5.7升级8.0报异常:ONLY_FULL_GROUP_BY的问题解决

MySQL 5.7升级8.0报异常:ONLY_FULL_GROUP_BY的问题解决

2024年11月28日 Mysql 我要评论
异常mysql8.0默认的sql模式包含了only_full_group_by,mysql5.7默认的sql模式也包含了only_full_group_by,但是mysql5.6是不包含的,有的项目从

异常

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报异常内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com