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

 更新时间:2024年11月27日 11:02:54   作者:图南随笔  
本文主要介绍了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报异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL的指定范围随机数函数rand()的使用技巧

    MySQL的指定范围随机数函数rand()的使用技巧

    这篇文章主要介绍了MySQL的指定范围随机数函数rand()的使用技巧,需要的朋友可以参考下
    2016-09-09
  • Mysql大表添加字段失败问题及解决

    Mysql大表添加字段失败问题及解决

    这篇文章主要介绍了Mysql大表添加字段失败问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Windows 8下MySQL Community Server 5.6安装配置方法图文教程

    Windows 8下MySQL Community Server 5.6安装配置方法图文教程

    这篇文章主要为大家详细介绍了Windows 8下MySQL Community Server 5.6安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Mysql的Binlog数据恢复:不小心删除数据库详解

    Mysql的Binlog数据恢复:不小心删除数据库详解

    这篇文章主要介绍了Mysql的Binlog数据恢复,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • MySQL子查询的空值问题解决

    MySQL子查询的空值问题解决

    本文主要介绍了MySQL子查询的空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Ubuntu下取消MySQL数据库本机绑定限制方法

    Ubuntu下取消MySQL数据库本机绑定限制方法

    在Ubuntu系统中,添加了MySQL账户,赋予了数据库完全操作权限,并且允许数据库从外部链接 但是,还是无法远程访问MySQL数据库
    2013-06-06
  • mysql事务和隔离级别底层原理浅析

    mysql事务和隔离级别底层原理浅析

    大家好,本篇文章主要讲的是mysql事务和隔离级别底层原理浅析,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • 配置hive元数据到Mysql中的全过程记录

    配置hive元数据到Mysql中的全过程记录

    这篇文章主要给的大家介绍了关于配置hive元数据到Mysql中的全过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • mysql中find_in_set()函数的使用详解

    mysql中find_in_set()函数的使用详解

    这篇文章主要介绍了mysql中find_in_set()函数的使用,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • mysql中包含查询的五种方法总结

    mysql中包含查询的五种方法总结

    这篇文章主要给大家介绍了关于mysql中包含查询的五种方法, 在MySQL中,包含语句是一种用来包含其他查询语句的语句,通常用在WHERE语句中,需要的朋友可以参考下
    2023-08-08

最新评论