解决 MySQL 5.7 及以上版本中的 “ONLY_FULL_GROUP_BY“ 错误

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 解决 MySQL 5.7 及以上版本中的 “ONLY_FULL_GROUP_BY“ 错误

在升级到 MySQL 5.7 或更高版本后,许多网站维护人员可能会遇到一个特定的 SQL 查询错误,它源于 MySQL 的默认配置变更。本文将深入解析该错误的成因,并提供一种有效的解决方法。

错误描述与原因

当您尝试执行某个 SELECT 查询时,可能会遇到如下所示的错误信息:

[42000][1055] Expression #34 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cloud.guest_os_category.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。在较新版本中,sql_mode 默认包含了 ONLY_FULL_GROUP_BY 选项,这意味着 MySQL 严格遵守了 SQL92 标准中关于 GROUP BY 子句的规定。

按照 ONLY_FULL_GROUP_BY 规则,当使用 GROUP BY 子句时,SELECT 列表中的每一项要么是聚合函数(如 COUNT(), SUM(), AVG() 等)的返回值,要么必须包含在 GROUP BY 子句中。换句话说,对于非聚合列,如果它们不在 GROUP BY 子句中,那么这些列的值必须在分组后是确定的,即它们对 GROUP BY 子句中列的值具有函数依赖关系。否则,MySQL 将抛出上述错误。


在您的例子中,错误提示指出列 'cloud.guest_os_category.id' 是一个非聚合列,它既未出现在 GROUP BY 子句中,也不具备对 GROUP BY 子句中列的函数依赖性。这与启用的 ONLY_FULL_GROUP_BY 模式不兼容,导致查询失败。

解决方案:调整 sql_mode 配置

为了解决这个问题并让您的查询能够顺利执行,可以考虑调整 MySQL 的 sql_mode 配置,移除 ONLY_FULL_GROUP_BY 选项。以下是具体操作步骤:


1. 编辑 MySQL 配置文件

使用文本编辑器打开 MySQL 的主配置文件,通常位于 /etc/my.cnf。在 [mysqld] 部分(如果没有,请自行添加)下方添加如下代码:

[mysqld]
#linux
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#window
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION


这里我们保留了其他有益于数据一致性和安全性的选项,而移除了可能导致问题的 ONLY_FULL_GROUP_BY

2. 重启 MySQL 服务

完成配置文件修改后,需要重启 MySQL 服务以使更改生效。在 Linux 系统中,可以使用以下命令:

sudo systemctl restart mysqld

3. 验证配置变更

重启服务后,您可以再次执行之前出错的查询,确认问题是否已得到解决。此外,通过运行 SHOW VARIABLES LIKE 'sql_mode'; 命令,检查当前的 sql_mode 设置,确认 ONLY_FULL_GROUP_BY 已被移除。


结语

调整 MySQL 的 sql_mode 配置,移除 ONLY_FULL_GROUP_BY 选项,可以有效地解决因严格 GROUP BY 规则引发的查询错误。然而,请注意,放宽 sql_mode 设置可能会影响到其他查询的行为和数据一致性。因此,在生产环境中进行此类更改时,务必谨慎评估其对整体系统的影响,并确保其他查询仍能满足业务需求和数据完整性要求。在可能的情况下,优化查询语句以符合 ONLY_FULL_GROUP_BY 规则是更为推荐的做法。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
25天前
|
SQL 关系型数据库 数据库
nacos 2.2.3版本 查看配置文件的历史版本的接口 是针对MySQL数据库的sql 改成postgresql后 sql语句报错 该怎么解决
在Nacos 2.2.3中切换到PostgreSQL后,执行配置文件历史版本分页查询出错,因`LIMIT 0, 10`语法不被PostgreSQL支持,需改为`LIMIT 10 OFFSET 0`。仅当存在历史版本时报错。解决方案是调整查询SQL以兼容PostgreSQL语法。
|
2天前
|
SQL 关系型数据库 MySQL
如何在MySQL 8.0版本中开启远程登录
如何在MySQL 8.0版本中开启远程登录
9 0
|
4天前
|
关系型数据库 MySQL 程序员
Windows版本 - MySQL卸载
Windows版本 - MySQL卸载
12 0
|
1月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版产品使用合集之2.2.1版本同步mysql数据写入doris2.0 ,同步完了之后增量的数据延迟能达到20分钟甚至一直不写入如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
关系型数据库 MySQL 数据库
mysqlTools 一分钟部署安装本mysql多个版本,解锁繁琐部署过程
mysqlTools 一分钟部署安装本mysql多个版本,解锁繁琐部署过程
357 2
|
1月前
|
SQL 关系型数据库 MySQL
查询mysql版本sql - 蓝易云
执行这个命令后,MySQL将返回当前正在运行的版本信息。
45 0
|
1月前
|
关系型数据库 MySQL 数据库连接
实时计算 Flink版产品使用合集之是否支持MySQL 5.7以下的版本
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
存储 关系型数据库 MySQL
XtraBackup支持哪些MySQL数据库版本?
【5月更文挑战第13天】XtraBackup支持哪些MySQL数据库版本?
84 0
|
1月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
【5月更文挑战第13天】PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
24 0
|
3天前
|
存储 关系型数据库 MySQL