`sql_mode=ONLY_FULL_GROUP_BY` 是MySQL 5.7.5版本及以上版本默认开启的一种SQL模式,它遵循SQL92标准,对SQL语句进行更严格的校验。当你在使用MySQL数据库时,如果遇到与此相关的错误,通常是因为你的查询语句不符合`ONLY_FULL_GROUP_BY`的要求。
原因分析
原理层面:`ONLY_FULL_GROUP_BY`要求在使用`GROUP BY`子句时,`SELECT`列表中的所有非聚合列都必须在`GROUP BY`子句中明确给出。
SQL层面:如果`SELECT`列表中的某个字段没有出现在`GROUP BY`子句中,并且没有使用聚合函数(如`SUM`, `AVG`, `MAX`, `MIN`等),则该查询会被视为非法,并抛出错误。
解决方法
检查当前`sql_mode` 使用以下查询语句检查当前的`sql_mode`设置:
```sql
SELECT @@GLOBAL.sql_mode;
```
修改`sql_mode`
你可以通过以下方法修改`sql_mode`,以去除`ONLY_FULL_GROUP_BY`的限制:
临时修改 ```sql SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'; ``` 永久修改: 编辑MySQL配置文件(如`my.cnf`或`my-default.ini`),在`[mysqld]`部分添加或修改`sql_mode`设置: ```ini 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服务以使更改生效。 调整查询语句
根据`ONLY_FULL_GROUP_BY`的要求,调整你的查询语句,确保所有`SELECT`列表中的非聚合列都在`GROUP BY`子句中有对应:
```sql
SELECT column1, column2
FROM table_name
GROUP BY column1, column2
```
总结
`sql_mode=ONLY_FULL_GROUP_BY`是MySQL 5.7.5及以上版本中为了遵循SQL92标准而默认开启的一种严格模式。解决与此相关的错误,需要检查当前的`sql_mode`设置,并根据需要进行调整,或是修改查询语句以符合`ONLY_FULL_GROUP_BY`的要求。