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
设置:
SELECT @@GLOBAL.sql_mode;
-
修改
sql_mode
你可以通过以下方法修改sql_mode
,以去除ONLY_FULL_GROUP_BY
的限制:
- 临时修改 :
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
- 永久修改 :
编辑MySQL配置文件(如my.cnf
或my-default.ini
),在[mysqld]
部分添加或修改sql_mode
设置:
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
子句中有对应:
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
的要求。