























### 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,因此报错。
# 临时生效
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 可以快速解决你的报错,但请务必注意以下几点:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。