📌  相关文章
📜  mysql 永久删除 only_full_group_by - SQL (1)

📅  最后修改于: 2023-12-03 15:17:48.238000             🧑  作者: Mango

MySQL 永久删除 only_full_group_by - SQL

简介

在 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 的 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.cnfmy.ini 中对 sql_mode 变量进行设置。具体的操作步骤如下:

  1. 打开 MySQL 配置文件。
  2. 搜索 sql_mode 关键字。
  3. ONLY_FULL_GROUP_BY 选项从变量值中删除。
  4. 保存文件并重启 MySQL 服务。

重新运行你的 SQL 语句,错误信息将不会再出现。

解决方案二:分组列全部包含 SELECT 列表中的列

另一种解决方法是将 GROUP BY 子句中的列全部包含在 SELECT 列表中,例如:

SELECT column1, SUM(column2)
FROM table
GROUP BY column1;

这样就可以避免 only_full_group_by 的问题了。

总结

无论使用哪种方法,对于一些聚合查询的 SQL 语句需要添加一些额外的处理。如果你的项目依赖于 MySQL 进行开发,那么记得在项目开始前,确认 MySQL 版本是否支持 only_full_group_by 选项,或者在开发时预留足够的时间来解决这些问题。