解决MySQL的sql_mode=only_full_group_by错误提示

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 在实际开发过程中,首选的做法应该是调整查询语句,确保查询逻辑的正确性和数据库的性能。在某些情况下,如果想要临时绕过规则,那么可以使用设置会话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 
目录
相关文章
|
1月前
|
SQL Oracle 关系型数据库
MySQL的sql_mode模式说明及设置
MySQL的sql_mode模式说明及设置
430 112
|
21天前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
2月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
20天前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
19天前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
143 11
|
5天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
3月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
262 62
|
4月前
|
SQL 数据采集 关系型数据库
实现MySQL与SQL Server之间数据迁移的有效方法
总的来说,从MySQL到SQL Server的数据迁移是一个涉及到很多步骤的过程,可能会遇到各种问题和挑战。但只要精心规划、仔细执行,这个任务是完全可以完成的。
307 18
|
5月前
|
SQL 关系型数据库 MySQL
【MySQL】SQL分析的几种方法
以上就是SQL分析的几种方法。需要注意的是,这些方法并不是孤立的,而是相互关联的。在实际的SQL分析中,我们通常需要结合使用这些方法,才能找出最佳的优化策略。同时,SQL分析也需要对数据库管理系统,数据,业务需求有深入的理解,这需要时间和经验的积累。
166 12
|
20天前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。

推荐镜像

更多