当出现“this is incompatible with sql_mode=only_full_group_by”错误提示时,可以通过以下方法解决:
一、理解问题原因
在 MySQL 中,开启了sql_mode=only_full_group_by
模式后,要求 SQL 语句在进行聚合查询时,必须保证查询结果中的非聚合列都在GROUP BY
子句中出现。如果不满足这个条件,就会出现上述错误提示。
二、解决方案
-
修改 SQL 查询语句
- 确保查询结果中的非聚合列都在
GROUP BY
子句中出现。例如,如果你的查询语句是SELECT column1, column2, SUM(column3) FROM table_name GROUP BY column1
,而你想要在结果中显示column2
,那么就需要将column2
也添加到GROUP BY
子句中,变成SELECT column1, column2, SUM(column3) FROM table_name GROUP BY column1, column2
。
- 确保查询结果中的非聚合列都在
-
临时关闭
only_full_group_by
模式- 可以在当前会话中临时关闭
only_full_group_by
模式。执行以下 SQL 语句:SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
。这将在当前会话中去除only_full_group_by
模式,但这只是临时解决方案,当会话结束后,该设置将恢复为默认值。
- 可以在当前会话中临时关闭
-
永久关闭
only_full_group_by
模式- 要永久关闭该模式,需要修改 MySQL 的配置文件。具体步骤如下:
- 找到 MySQL 的配置文件,通常是
my.cnf
(Linux 和 macOS)或my.ini
(Windows)。 - 打开配置文件,在
[mysqld]
部分添加以下行:sql_mode=''
(这将清除所有的 SQL 模式设置,包括only_full_group_by
)。或者,可以将sql_mode
设置为不包含only_full_group_by
的值,例如: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 服务,使更改生效。
- 找到 MySQL 的配置文件,通常是
- 要永久关闭该模式,需要修改 MySQL 的配置文件。具体步骤如下:
请注意,关闭only_full_group_by
模式可能会导致一些不符合标准的 SQL 查询结果,因此在做出更改之前,请确保你充分理解其影响。同时,建议在开发过程中遵循 SQL 标准,以确保查询的准确性和可移植性。