解决MySQL的sql_mode=only_full_group_by错误提示

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在实际开发过程中,首选的做法应该是调整查询语句,确保查询逻辑的正确性和数据库的性能。在某些情况下,如果想要临时绕过规则,那么可以使用设置会话sql_mode的方式暂时禁用 `ONLY_FULL_GROUP_BY`,但这种做法应当谨慎使用,以免在生产环境中带来难以预料的结果。对于程序发布的环境,建议遵守 `ONLY_FULL_GROUP_BY`的规则。而使用 `ANY_VALUE()`是一种折衷的选择,它保持 `sql_mode`设置不变,同时解决了错误提示问题。

在MySQL中 ONLY_FULL_GROUP_BY模式是启用严格的GROUP BY检查。如果一个SQL查询含有GROUP BY语句,只有在SELECT中的每一列要么是在GROUP BY语句中声明的,要么是通过聚合函数计算出来的,此时查询才符合 ONLY_FULL_GROUP_BY的要求。

这个设置的设计初衷是为了避免不精确或者不可预知的查询结果,因为在未指定完全分组条件的情况下,非聚合列的值可能有多个而导致返回结果难以预测。

当遇到MySQL 报错提示 sql_mode=only_full_group_by,意味着我们的查询没有完全遵守这种严格的规则。解决这个错误消息通常有以下几种策略:

1. 调整查询语句

调整SQL查询,确保SELECT后面跟的每一个字段都符合 ONLY_FULL_GROUP_BY的要求。对于GROUP BY后面没有包含的字段,要使用聚合函数,例如,AVG(), COUNT(), MIN(), MAX(), SUM() 等。

示例调整:

SELECT customer, MAX(sale_date) 最后购买日期
FROM sales
GROUP BY customer;
​

这里,customer是GROUP BY的一部分,而 sale_date使用了MAX()聚合函数,因此避免了错误。

2. 禁用 ONLY_FULL_GROUP_BY

如果确信查询结果是符合期望的,或者是在开发环境中并且想要临时允许这种行为,可以通过修改MySQL配置来禁用 ONLY_FULL_GROUP_BY

这可以通过以下几种方式完成:

临时禁用:

可以在MySQL客户端中执行以下命令禁用 ONLY_FULL_GROUP_BY

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
​

或者针对当前会话:

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
​

永久禁用(不建议在生产环境中这样做):

在服务器配置文件中修改 sql_mode,去掉 ONLY_FULL_GROUP_BY。具体操作如下:

  1. 找到MySQL配置文件(通常为 my.cnfmy.ini,位置根据不同系统可能有所不同)。
  2. sql_mode变量的值更改为不包含 ONLY_FULL_GROUP_BY
  3. 重启MySQL服务器使配置生效。

3. 使用ANY_VALUE()函数

从MySQL 5.7.5开始,引入了ANY_VALUE()函数来抑制 ONLY_FULL_GROUP_BY的聚合检查。这可以允许查询选择一个非聚合列的任何值。

示例:

SELECT customer, ANY_VALUE(sale_date) 任意购买日期
FROM sales
GROUP BY customer;
​

采用以上方法之一可以有效解决 sql_mode=only_full_group_by错误。

在实际开发过程中,首选的做法应该是调整查询语句,确保查询逻辑的正确性和数据库的性能。在某些情况下,如果想要临时绕过规则,那么可以使用设置会话sql_mode的方式暂时禁用 ONLY_FULL_GROUP_BY,但这种做法应当谨慎使用,以免在生产环境中带来难以预料的结果。对于程序发布的环境,建议遵守 ONLY_FULL_GROUP_BY的规则。而使用 ANY_VALUE()是一种折衷的选择,它保持 sql_mode设置不变,同时解决了错误提示问题。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
19天前
|
安全 编译器 C++
波奇学习系列:C++11的革新特性总览
这些功能的加入对C++编程实践意味着代码能够变得更加简洁、高效和强大。它们提供了新的解决方案来降低复杂问题的解决难度,并且增强了C++语言在系统编程、资源受限硬件、高性能计算等领域的竞争力。对于开发者而言,适应这些新特性将是提升开发效率、代码质量和维护性的关键。
70 0
|
23天前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
344 43
|
6天前
|
人工智能 弹性计算 自然语言处理
云速搭 AI 助理发布:对话式生成可部署的阿里云架构图
阿里云云速搭 CADT(Cloud Architect Design Tools)推出智能化升级——云小搭,一款基于大模型的 AI 云架构助手,致力于让每一位用户都能“动动嘴”就完成专业级云架构设计。
189 26
|
4天前
|
Linux Python
在CentOS 7上编译安装Python 3.8的步骤
总结而言,此安装流程涵盖从前期准备至Python 3.8搭建和虚拟环境配置。通过编译源码安装,用户能得到最适合自身系统的Python版本,同时不会干扰既有系统Python环境,符合大多数专业开发人员对多版本Python共存的需求。
57 17
|
4天前
|
关系型数据库 MySQL 数据库
MySQL用户创建及权限分配的步骤
通过以上步骤可以有效地在 MySQL 中管理不同层次、不同范围内对于数据与结构进行精确控制。
48 20
|
21天前
|
人工智能 Kubernetes Cloud Native
MSE Nacos Controller:为 Kubernetes 生态构建配置管理与服务发现的桥梁
在企业云原生转型过程中,如何实现传统微服务与 Kubernetes 服务的配置统一管理、服务互通及协议转换成为关键挑战。MSE Nacos Controller 应运而生,作为连接 Kubernetes 与 Nacos 的桥梁,支持 ConfigMap 与 Nacos 配置双向同步、服务自动注册发现,并助力 Higress 等 MCP 网关实现 REST API 向 AI 可调用 MCP 服务的转换,全面提升系统治理能力与智能化水平。
169 31
|
25天前
|
机器学习/深度学习 人工智能 算法
AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN
本文系统回顾了计算机视觉的发展历程,从早期基于手工特征的传统方法,到深度学习的崛起与卷积神经网络(CNN)的广泛应用,并通过数学原理、代码示例与可视化手段,全面解析了卷积操作的本质与CNN的架构设计。
201 33
AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN