sql_mode=only_full_group_by

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等),则该查询会被视为非法,并抛出错误。

解决方法

  1. 检查当前sql_mode

使用以下查询语句检查当前的sql_mode设置:

SELECT @@GLOBAL.sql_mode;
  1. 修改sql_mode

你可以通过以下方法修改sql_mode,以去除ONLY_FULL_GROUP_BY的限制:

  • 临时修改
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
  • 永久修改

编辑MySQL配置文件(如my.cnfmy-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服务以使更改生效。

  1. 调整查询语句

根据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的要求。

Top