---
title: ONLY_FULL_GROUP_BY 报错分析与解决-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于ONLY_FULL_GROUP_BY 报错分析与解决相关的常见问题和使用技巧，帮助您快速解决ONLY_FULL_GROUP_BY 报错分析与解决的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# ONLY_FULL_GROUP_BY 报错分析与解决

更新时间：2026-08-21 03:56

适用版本： V4.2.x 内容类型：Troubleshoot  

## 问题现象

在 OceanBase 数据库的 MySQL 租户模式下，当 SQL 模式设置为 `ONLY_FULL_GROUP_BY` 时，执行不带 `GROUP BY` 子句但包含聚合函数（如 `SUM()`）和非聚合列的 SQL 语句，预期不会报错，但实际上却出现了错误：

```shell
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 条件中的表达式能唯一确定非聚合列的值，但未被正确识别为常量表达式

```sql
-- 复现用例
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 条件不能满足唯一确定非聚合列的值（常见简单场景）

```sql
-- 创建测试表
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

```

## 关键信息

1. 问题出现在 MySQL 租户模式下，且 SQL 模式启用了 `ONLY_FULL_GROUP_BY` 检查。
 2. SQL WHERE 条件中的表达式能够唯一确定非聚合列的值，但是这些表达式没有被正确识别为常量表达式。例如，表达式 `STR_TO_DATE(CONCAT('2025', '1231'), '%Y%m%d')`。

SQL 示例：

```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 模式设置：

```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` 模式的要求。

```sql
SELECT sum(YBTSE), SKSSQQ FROM STD_SYPT_SBXX WHERE SKSSQQ = STR_TO_DATE(CONCAT('2025', '1231'), '%Y%m%d') GROUP BY SKSSQQ;

```

- **使用常量值**：将 WHERE 条件中的函数表达式替换为常量值，确保非聚合列能够被唯一确定。

```sql
SELECT sum(YBTSE), SKSSQQ FROM STD_SYPT_SBXX WHERE SKSSQQ = '2025-12-31';

```

## 规避方式

- **添加 GROUP BY 子句**：在 SQL 语句中明确指定 `GROUP BY` 子句，确保所有非聚合列都被正确处理。
 - **使用常量值**：避免在 WHERE 条件中使用复杂的函数表达式，尽量使用常量值来唯一确定非聚合列的值。

Previous

[OceanBase 数据库 GTS 服务使用指南](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002396303)

Next

[绑定 outline 后，原有查询里的 hint 都会被忽略](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002342479) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
