📅  最后修改于: 2023-12-03 15:17:48.238000             🧑  作者: Mango
在 MySQL 5.7.5 版本之后,MySQL 默认打开了 only_full_group_by
系统变量,这个选项表示当 GROUP BY
子句中的列存在聚合函数之外的列时,MySQL 是否允许进行查询。如果设置为 ONLY_FULL_GROUP_BY
,则表示 MySQL 只会返回与 GROUP BY
列一致的结果,否则返回可能不准确的结果。
针对 only_full_group_by
选项在开启的情况下报错的问题,本文将提供一些解决方案。
当使用聚合函数时,可能会遇到以下类似的错误信息:
Error: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database.table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
这是由于 only_full_group_by
选项导致的问题,如果想要解决这个问题,需要做出相应的设置。
将 MySQL 的 SQL 模式修改为默认模式,可以通过两种方式实现:
可以在连接到 MySQL 后,运行以下命令禁用 only_full_group_by
选项:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
或者使用以下命令来修改 SQL 模式:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
修改后,重新运行你的 SQL 语句,错误信息将不会再出现。
可以在 MySQL 的配置文件 my.cnf
或 my.ini
中对 sql_mode
变量进行设置。具体的操作步骤如下:
sql_mode
关键字。ONLY_FULL_GROUP_BY
选项从变量值中删除。重新运行你的 SQL 语句,错误信息将不会再出现。
另一种解决方法是将 GROUP BY
子句中的列全部包含在 SELECT
列表中,例如:
SELECT column1, SUM(column2)
FROM table
GROUP BY column1;
这样就可以避免 only_full_group_by
的问题了。
无论使用哪种方法,对于一些聚合查询的 SQL 语句需要添加一些额外的处理。如果你的项目依赖于 MySQL 进行开发,那么记得在项目开始前,确认 MySQL 版本是否支持 only_full_group_by
选项,或者在开发时预留足够的时间来解决这些问题。