mysql之sql_mode =only_full_group_by 设置问题
一、基础环境
linux centos 7, mysql 5.7.26
二、问题描述
使用group by 进行分组查询时,提示异常: SELECT list is not in GROUP BY clause and contains nonaggregated column ‘XXX’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode =only_full_group_by
三、问题原因
大概查了一下相关原因,意思是:当你使用group by 做分组查询时,分组使用的列,那么你select就必须带上分组的列,是因为mysql5.7以上版本增加了sql_mode=ONLY_FULL_GROUP_BY 的设定,这一点在异常描述里面也提示了。
举个例子:
select id,name from Users group by id,sex; 如果这里select的列不带上sex,那么就会报上面这个异常。
四、解决方式
按照实际业务操作,上面例子这种sql写法是存在的,并且应用挺多,那么我们想让例子的这种写法符合mysql规范的话,就需要更改mysql的sql_mode配置了,具体操作如下:
通过sql的方式更改sql_mode(当前生效,重启mysql后失效)
进入mysql客户端,执行以下命令:
select @@GLOBAL.sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
发现存在ONLY_FULL_GROUP_BY, 执行以下设置即可:
set@@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
通过mysql配置my.cnf更改sql_mode(一劳永逸)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?