解决MySQL的sql_mode=only_full_group_by错误提示

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 在实际开发过程中,首选的做法应该是调整查询语句,确保查询逻辑的正确性和数据库的性能。在某些情况下,如果想要临时绕过规则,那么可以使用设置会话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设置不变,同时解决了错误提示问题。

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
SQL Oracle 关系型数据库
MySQL的sql_mode模式说明及设置
MySQL的sql_mode模式说明及设置
1131 112
|
8月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1155 152
|
6月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
887 156
|
9月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
1178 213
|
6月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
6月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
6月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
688 11
|
6月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
483 158

推荐镜像

更多