基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
ONLY_FULL_GROUP_BY 报错分析与解决
更新时间:2026-08-21 03:56
问题现象
在 OceanBase 数据库的 MySQL 租户模式下,当 SQL 模式设置为 ONLY_FULL_GROUP_BY 时,执行不带 GROUP BY 子句但包含聚合函数(如 SUM())和非聚合列的 SQL 语句,预期不会报错,但实际上却出现了错误:
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
此问题在特定租户中出现,而在其他租户或本地环境中可能无法复现。
问题原因
问题的根本原因是 OceanBase 内核的一个兼容性检查问题。在 MySQL 租户模式下,当 SQL 模式设置为 ONLY_FULL_GROUP_BY 时,即使 WHERE 条件中的表达式能够唯一确定非聚合列的值,这些表达式也没有被正确识别为常量表达式。如果这些表达式能被正常标记为常量表达式,就能避免返回值不确定的行,从而通过 ONLY_FULL_GROUP_BY 模式下的检查。否则,就必须在 GROUP BY 子句中覆盖所有非聚合列,以防止非确定性查询。
场景一:WHERE 条件中的表达式能唯一确定非聚合列的值,但未被正确识别为常量表达式
-- 复现用例
SET sql_mode = 'ONLY_FULL_GROUP_BY';
DROP TABLE IF EXISTS test_repro;
CREATE TABLE test_repro (
id INT PRIMARY KEY,
val INT,
dt VARCHAR(20) -- 关键:使用 VARCHAR 类型
);
INSERT INTO test_repro VALUES (1, 100, '2025-12-31');
INSERT INTO test_repro VALUES (2, 200, '2025-12-31');
-- 这个 SQL 会报错
SELECT SUM(val), dt FROM test_repro
WHERE dt = STR_TO_DATE(CONCAT('2025', '1231'), '%Y%m%d');
-- ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)
-- with no GROUP columns is illegal if there is no GROUP BY clause
场景二:WHERE 条件不能满足唯一确定非聚合列的值(常见简单场景)
-- 创建测试表
DROP TABLE IF EXISTS `std_sypt_sbxx`;
CREATE TABLE IF NOT EXISTS `std_sypt_sbxx` (
`UUID` varchar(50) NOT NULL,
`SKSSQQ` datetime DEFAULT NULL,
`YBTSE` decimal(22,2) DEFAULT NULL,
PRIMARY KEY (`UUID`)
);
-- 设置 SQL 模式
SET SESSION 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';
-- 插入测试数据
INSERT INTO `std_sypt_sbxx` VALUES
('1', STR_TO_DATE('20250101', '%Y%m%d'), 1000.00),
('2', STR_TO_DATE('20250101', '%Y%m%d'), 2000.00),
('3', STR_TO_DATE('20250101', '%Y%m%d'), 1500.00),
('4', STR_TO_DATE('20250201', '%Y%m%d'), 500.00),
('5', STR_TO_DATE('20250301', '%Y%m%d'), 800.00);
-- 执行查询,会报错
SELECT sum(YBTSE), SKSSQQ FROM STD_SYPT_SBXX;
-- ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
关键信息
- 问题出现在 MySQL 租户模式下,且 SQL 模式启用了
ONLY_FULL_GROUP_BY检查。 - SQL WHERE 条件中的表达式能够唯一确定非聚合列的值,但是这些表达式没有被正确识别为常量表达式。例如,表达式
STR_TO_DATE(CONCAT('2025', '1231'), '%Y%m%d')。
SQL 示例:
SELECT sum(YBTSE), SKSSQQ FROM STD_SYPT_SBXX WHERE SKSSQQ = STR_TO_DATE(CONCAT('2025', '1231'), '%Y%m%d');
错误信息:ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause。
确认 SQL 模式设置:
show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
问题的风险及影响
- SQL 执行报错:特定 SQL 语句在执行时会报错,影响业务逻辑的正常运行。
- 数据正确性问题:由于 SQL 语句无法正确执行,可能导致数据查询结果不准确。
适用版本
OceanBase 数据库 V4.2.x 版本。
解决方法
- 添加 GROUP BY 子句:确保所有非聚合列都在
GROUP BY子句中列出,以满足ONLY_FULL_GROUP_BY模式的要求。
SELECT sum(YBTSE), SKSSQQ FROM STD_SYPT_SBXX WHERE SKSSQQ = STR_TO_DATE(CONCAT('2025', '1231'), '%Y%m%d') GROUP BY SKSSQQ;
- 使用常量值:将 WHERE 条件中的函数表达式替换为常量值,确保非聚合列能够被唯一确定。
SELECT sum(YBTSE), SKSSQQ FROM STD_SYPT_SBXX WHERE SKSSQQ = '2025-12-31';
规避方式
- 添加 GROUP BY 子句:在 SQL 语句中明确指定
GROUP BY子句,确保所有非聚合列都被正确处理。 - 使用常量值:避免在 WHERE 条件中使用复杂的函数表达式,尽量使用常量值来唯一确定非聚合列的值。