惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
U
Unit 42
人人都是产品经理
人人都是产品经理
罗磊的独立博客
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
T
Tailwind CSS Blog
GbyAI
GbyAI
Blog — PlanetScale
Blog — PlanetScale
I
InfoQ
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
B
Blog RSS Feed
WordPress大学
WordPress大学
腾讯CDC
H
Help Net Security
博客园 - Franky
博客园 - 【当耐特】
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
B
Blog
Vercel News
Vercel News
博客园 - 司徒正美

沉迷在 - Java.li - 无法自拔

Spring Boot 整合 MyBatis DeepSeek Harness 深入解读 Spring Boot 连接 MySQL GitHub发生故障,崩了7个小时 Spring Boot 配置文件怎么写 SpringBoot 教程 MyBatis Invalid bound statement 怎么处理 Spring Boot 端口被占用怎么处理 Qdrant 向量数据库入门 Spring Boot 接收 JSON 参数 Spring Boot启动报错 Failed to configure a DataSource 解决办法 Maven依赖冲突怎么排查?dependency:tree、exclusions与版本统一完整教程 - 沉迷在 - Java.li - 无法自拔 给网站加一条会动的人群横幅:Little People 动画组件 Demo - 沉迷在 - Java.li - 无法自拔 【soso.re】聚合热榜 | CloudflareWorkers部分接口失效的排查与代理方案 - 沉迷在 - Java.li - 无法自拔 Spring Boot 2升级到Spring Boot 3完整指南:JDK17、javax迁移jakarta、依赖兼容与常见报错 - 沉迷在 - Java.li - 无法自拔 随机小姐姐视频 - 沉迷在 - Java.li - 无法自拔 Spring Boot与JDK版本兼容表:Spring Boot 2.x / 3.x / 4.x应该用哪个Java版本? - 沉迷在 - Java.li - 无法自拔 No compiler is provided in this environment解决办法:JDK、JRE、Maven与IDEA排查 - 沉迷在 - Java.li - 无法自拔 置身钉内|含全文 PDF - 沉迷在 - Java.li - 无法自拔 javac不是内部或外部命令怎么解决?JDK、JAVA_HOME和Path完整排查 Windows配置JAVA_HOME后不生效怎么办?java -version显示旧版本解决办法 Maven Could not transfer artifact 下载失败解决:settings.xml、国内镜像、本地缓存与代理排查 JSON转Java实体类完整教程:对象、数组、嵌套结构与LocalDateTime处理 Windows安装JDK 8 / 17 / 21 / 25完整教程:JAVA_HOME环境变量配置与验证 IDEA下载JDK很慢怎么办?手动配置本地JDK完整教程 Java版本号与class文件major version对照表:Unsupported class file major version 52 / 55 / 61 / 65 / 69 / 70 Gradle国内镜像配置教程:init.gradle、repositories与Wrapper加速完整指南 Maven国内镜像settings.xml配置大全:阿里云、腾讯云、华为云、清华源 Java开发者必备工具箱 2026年Java行情深度解读:就业真实现状、语言排名与开发者破局指南
解决MySQL ONLY_FULL_GROUP_BY 模式导致的 SQL 语法错误
HiF · 2026-03-11 · via 沉迷在 - Java.li - 无法自拔

报错信息

### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ''xxx.d.brand_id'' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这是一个典型的 MySQL ONLY_FULL_GROUP_BY 模式导致的 SQL 语法错误。

原因分析

SQL 语句中使用了 GROUP BY d.source_detail_id,但是在 SELECT 列表中包含了其他非聚合列(如 d.brand_id, d.brand_name, d.unit_id 等),而这些列并没有出现在 GROUP BY 子句中。
在 MySQL 5.7+ 版本中,默认开启了 sql_mode=ONLY_FULL_GROUP_BY。该模式要求:SELECT 列表中的每一列,要么必须包含在 GROUP BY 子句中,要么必须使用聚合函数(如 SUM, MAX, MIN, ANY_VALUE 等)进行包裹。
数据库认为,如果你只按 source_detail_id 分组,那么对于同一个 source_detail_id,如果存在多行数据且它们的 brand_id 不同,数据库就无法确定应该返回哪一行的 brand_id,因此报错。

解决办法

  1. 修改 SQL,将所有非聚合字段加入 GROUP BY;
  2. 使用 ANY_VALUE() 函数包裹非聚合列(快速修复,无需改 GROUP BY);
    如果你确定同一个 source_detail_id 下这些属性值是唯一的,或者你不在乎取哪一行的值,可以使用 MySQL 的 ANY_VALUE() 函数。这告诉数据库:“随便取一个值给我,不要报错”。
  3. 关闭 ONLY_FULL_GROUP_BY 模式;
    # 临时生效
    SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    
    # 永久生效
    SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    
    我使用的是云数据库,操作步骤是在云控制台,找到数据库实例,点击操作,选择修改参数,在参数列表中搜索 sql_mode,将 ONLY_FULL_GROUP_BY 改为空,提交参数后立即生效。

重要提示

虽然关闭 ONLY_FULL_GROUP_BY 可以快速解决你的报错,但请务必注意以下几点:

  1. 数据不确定性风险:
    关闭该模式后,MySQL 允许 SELECT 列表中出现在 GROUP BY 之外的非聚合列。如果这些列在分组后有多不同的值,MySQL 会随机返回其中一行的值。
  2. 主从同步/集群问题:
    如果你的架构包含只读实例(Read-only instances)或集群,确保所有节点的 sql_mode 配置一致,否则可能导致主从同步错误或查询结果不一致。