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

相关文章

  • dubbo中zookeeper请求超时问题:mybatis+spring连接mysql8.0.15的配置

    dubbo中zookeeper请求超时问题:mybatis+spring连接mysql8.0.15的配置

    这篇文章主要介绍了dubbo中zookeeper请求超时问题:mybatis+spring连接mysql8.0.15的配置,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 一文带你深入了解 MySQL的锁机制

    一文带你深入了解 MySQL的锁机制

    在数据库系统中,同时有多个用户或进程访问数据是常见的情况,为了确保数据的完整性和一致性,数据库管理系统引入了锁机制,本文将深入探讨 MySQL 锁机制,帮助您理解锁的分类、实现方式以及使用场景和优化策略,需要的朋友可以参考下
    2023-05-05
  • Mysql主从同步如何重置

    Mysql主从同步如何重置

    在MySQL数据库运维中,遇到主从数据库数据不一致时需要进行同步重置,本文介绍了主从同步重置的具体步骤:首先对从库操作,包括停止slave、重置从库;其次对主库进行操作,包括重置主库同步设置、锁定主库;最后从库导入主库数据
    2024-10-10
  • mysql整数数据类型深入解析

    mysql整数数据类型深入解析

    本篇文章是对mysql中的整数数据类型进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL如何使用union all获得并集排序

    MySQL如何使用union all获得并集排序

    这篇文章主要介绍了MySQL如何使用union all获得并集排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • C#如何在海量数据下的高效读取写入MySQL

    C#如何在海量数据下的高效读取写入MySQL

    这篇文章主要介绍了C#如何在海量数据下的高效读取写入MySQL的相关资料,需要的朋友可以参考下
    2016-12-12
  • MySQL数据库管理常用命令小结

    MySQL数据库管理常用命令小结

    MySQL数据库是一种开放源代码的关系型数据库管理系统,MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理,MySQL数据库管理有它自己独特的使用命令,下面为您介绍MySQL数据库管理常用命令。
    2011-03-03
  • mysql错误处理之ERROR 1665 (HY000)

    mysql错误处理之ERROR 1665 (HY000)

    最近一直在mysql的各个版本直接徘徊,这中间遇到了各种各样的错误,将已经处理完毕的几个错误整理了一下,分享给大家,这次我们来看看错误提示 ERROR 1665 (HY000)
    2014-07-07
  • SQL语句中LEFT JOIN的ON和WHERE有什么区别

    SQL语句中LEFT JOIN的ON和WHERE有什么区别

    这篇文章主要介绍了SQL语句中LEFT JOIN的ON和WHERE之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • MySQL登录、访问及退出操作实战指南

    MySQL登录、访问及退出操作实战指南

    当我们要使用mysql时,一定要了解mysql的登录、访问及退出,下面这篇文章主要给大家介绍了关于MySQL登录、访问及退出操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10

最新评论