MySQL报错sql_mode=only_full_group_by的问题解决

 更新时间:2025年02月07日 09:32:46   作者:我梦Leo  
本文主要介绍了MySQL报错sql_mode=only_full_group_by的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

报错信息

DataGrip 报错还原

[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘xx库.xx表.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

在这里插入图片描述

Navicat 报错还原

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘school.student_100w.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

在这里插入图片描述

报错原因

MySQL 5.7后,MySQL的 SQL_MODE 配置项会默认包含 only_full_group_by 模式,这个配置会严格执行SQL92标准。如果代码中含有group by聚合操作,那么select中的列,除了使用聚合函数之外的,如max()、min()等,都必须出现在group by中。

要求:从学生表中,根据班级编号,分组查询班级编号、班级名称。

报错:SELECT 查询的字段和 GROUP BY 分组依据的字段不统一。

# SELECT 查询的字段和 GROUP BY 分组依据的字段不统一,会报错。
SELECT class_number, class_name FROM student GROUP BY class_number;

调整:将SELECT 查询的字段和 GROUP BY 分组依据的字段统一。

# SELECT 查询字段和 GROUP BY 分组依据的字段统一后就不会报错。
SELECT class_number, class_name FROM student GROUP BY class_number, class_name ;
# SELECT 查询字段和 GROUP BY 分组依据的字段统一后就不会报错。
SELECT class_number FROM student GROUP BY class_number;

解决方案

查看当前 sql mode

执行 SQL 语句,查看当前的 sql_mode 。

SELECT @@global.sql_mode;

注意默认的列宽可能无法直接查看全部内容,容易造成误解,需要手动拉伸列宽查看。

在这里插入图片描述

拉伸列宽后可查看全部内容,(不同版本的 MySQL 默认值可能不同)。

在这里插入图片描述

方案一:临时解决

排除当前 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_ENGINE_SUBSTITUTION';

但是如果当前数据库重启后,还是回归默认设置,即包含 ONLY_FULL_GROUP_BY 模式。

方案二:永久解决

windows系统,直接修改 my.ini 配置文件。

在这里插入图片描述

在 [mysqld] 模块下新增一行配置:

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

注意:

  • 不能有多余的符号,我之前在结尾加了分号导致重启失败。
  • 点击保存文件,不要直接关掉。 不然设置丢失,是不会生效的。

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f6c6cb0048814855854fefede42f0be4.png

Linux系统,思路是一样的,都是找配置文件修改配置。但是不同Mysql版本,路径和配置文件名称可能不同:大致可能是 /etc/my.cnf 或者 /mysql.conf 之类的名称。

数据库重启后生效。

方案三:使用 any_value() 或 group_concat()

  • any_value():
    • 将分到同一组的数据里第一条数据的指定列值作为返回数据。 (any_value()函数就是MySQL提供的用来抑制ONLY_FULL_GROUP_BY值被拒绝的)
SELECT class_number, any_value(class_name) FROM student GROUP BY class_number;

实际使用效果如下:

在这里插入图片描述

  • group_concat():
    • 将分到同一组的数据默认用逗号隔开作为返回数据。
SELECT class_number, group_concat(class_name) FROM student GROUP BY class_number;

实际使用效果如下:

在这里插入图片描述

方案四:调整实现思路,避开 GROUP BY 使用

通过对SQL的查询思路调整,代码逻辑调整等,部分场景是可以绕开对 GROUP BY 关键字筛选依赖的。这个需要结合实际业务场景,自己去思考调整了。

到此这篇关于MySQL报错sql_mode=only_full_group_by的问题解决的文章就介绍到这了,更多相关MySQL sql_mode=only_full_group_by内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • CentOS 7.0如何启动多个MySQL实例教程(mysql-5.7.21)

    CentOS 7.0如何启动多个MySQL实例教程(mysql-5.7.21)

    这篇文章主要给大家介绍了关于CentOS 7.0如何启动多个MySQL实例(mysql-5.7.21)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2018-03-03
  • MySQL普通表转换为分区表实战指南

    MySQL普通表转换为分区表实战指南

    本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表,分区表在处理庞大数据集时展现出显著的性能优势,不仅能大幅提升查询速度,还能有效简化数据维护工作,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-06-06
  • 详解MySQL日期 字符串 时间戳互转

    详解MySQL日期 字符串 时间戳互转

    本篇文章主要介绍了详解MySQL日期 字符串 时间戳互转,详解date转字符串、date转时间戳、字符串转date、字符串转时间戳、时间戳转date,时间戳转字符串,有兴趣的可以了解一下。
    2017-01-01
  • CentOS7下安装MySQL5.7.39的详细过程

    CentOS7下安装MySQL5.7.39的详细过程

    这篇文章主要介绍了CentOS7下安装MySQL5.7.39的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • MySQL隐式类型转换导致索引失效的解决

    MySQL隐式类型转换导致索引失效的解决

    本文主要介绍了MySQL隐式类型转换导致索引失效的解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • MySQL 用户权限与安全管理最佳实践

    MySQL 用户权限与安全管理最佳实践

    MySQL用户权限与安全管理是保障数据库系统稳定与安全的重要环节,通过合理设计权限模型、使用 GRANT/REVOKE命令管理权限、实施最小权限原则以及加强密码,可以大幅降低数据库被非法访问和数据泄露的风险,这篇文章主要介绍了MySQL 用户权限与安全管理,需要的朋友可以参考下
    2025-03-03
  • MySQL字段类型与Java实体类类型对应转换关系详解

    MySQL字段类型与Java实体类类型对应转换关系详解

    这篇文章主要介绍了MySQL字段类型与Java实体类类型对应转换关系,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 利用frm和ibd文件恢复mysql表数据的详细过程

    利用frm和ibd文件恢复mysql表数据的详细过程

    总是遇到mysql服务意外断开之后导致mysql服务无法正常运行的情况,使用Navicat工具查看能够看到里面的库和表,但是无法获取数据记录,提示数据表不存在,所以本文给大家介绍了利用frm和ibd文件恢复mysql表数据的详细过程,需要的朋友可以参考下
    2024-04-04
  • 分享几道关于MySQL索引的重点面试题

    分享几道关于MySQL索引的重点面试题

    这篇文章主要给大家介绍了几道关于MySQL索引的重点面试题,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • MySQL中表分区技术详细解析

    MySQL中表分区技术详细解析

    数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是透明的。
    2016-06-06

最新评论