如何解决MySQL this is incompatible with sql_mode=only_full_group_by问题

 更新时间:2024年11月20日 09:48:20   作者:乔丹搞IT  
MySQL的ONLY_FULL_GROUP_BY模式要求在使用GROUP BY时,SELECT语句中引用的所有列必须在GROUP BY子句中明确指定,或者是聚合函数的一部分,本文提供了修改SQL语句、使用聚合函数、禁用ONLY_FULL_GROUP_BY等解决方法,并强调了在禁用该模式时应评估其影响

MySQL this is incompatible with sql_mode=only_full_group_by

代码示例:

在MySQL中,ONLY_FULL_GROUP_BY 是一个SQL模式设置,它要求在使用GROUP BY时,SELECT语句中引用的所有列必须在GROUP BY子句中明确指定,或者是聚合函数的一部分。

这个模式的目的是为了防止产生不确定的查询结果。

如果你遇到了ONLY_FULL_GROUP_BY的错误,以下是一些解决方案:

1.修改SQL语句

  • 确保SELECT列表中的所有列要么包含在GROUP BY子句中,要么作为聚合函数的一部分。
  • 例如,如果你的查询是这样的:
SELECT column1, column2 FROM table GROUP BY column1;
  • 你需要将column2也加入到GROUP BY子句中
  • 或者对column2使用聚合函数
  • MAX(column2)SUM(column2)

2.使用聚合函数

  • 对于SELECT列表中不在GROUP BY子句中的列
  • 可以使用聚合函数,如MAX(), MIN(), SUM(), COUNT()

3.禁用ONLY_FULL_GROUP_BY

  • 你可以在会话级别或全局级别禁用ONLY_FULL_GROUP_BY
  • 这可以通过以下命令完成:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
  • 或者,你可以修改MySQL的配置文件(例如my.cnfmy.ini
  • 去掉ONLY_FULL_GROUP_BY
[mysqld]
sql_mode = NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • 修改配置文件后,需要重启MySQL服务以使更改生效。

4.使用ANY_VALUE()函数

  • ANY_VALUE()函数可以用来选择每个分组的任意值
  • 这在某种程度上可以绕过ONLY_FULL_GROUP_BY的限制

5.永久修改sql_mode

  • 在某些情况下,如果你不希望每次重启MySQL服务后都要重新设置sql_mode,你可以将更改永久化到MySQL的配置文件中。
  • 请注意,禁用ONLY_FULL_GROUP_BY可能会让你的查询结果变得不确定,因为MySQL将不再强制要求GROUP BY子句包含所有非聚合列。
  • 因此,在禁用这个模式之前,最好先评估一下它对你的查询逻辑和结果的影响。

如果你正在使用MySQL 8.0或更高版本,并且尝试修改sql_mode时遇到了问题,比如出现了错误:

ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'

  • 这是因为在MySQL 8.0及以上版本中,NO_AUTO_CREATE_USER已经被移除。
  • 在这种情况下,你需要从sql_mode中移除这个值。
  • 在处理这个问题时,建议先尝试修改SQL语句以符合ONLY_FULL_GROUP_BY的要求,因为这是最安全的做法,可以避免潜在的数据一致性问题。
  • 如果这不可能或者不切实际,那么再考虑禁用ONLY_FULL_GROUP_BY

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL分库分表后路由策略设计详情

    MySQL分库分表后路由策略设计详情

    这篇文章主要介绍了MySQL分库分表后路由策略设计详情,分库分表后设计到的第一个问题就是,如何选择路由key,应该如何对key进行路由
    2022-08-08
  • MySQL嵌套事务所遇到的问题

    MySQL嵌套事务所遇到的问题

    这篇文章主要介绍了MySQL嵌套事务所遇到的问题的相关资料,需要的朋友可以参考下
    2017-02-02
  • SQL实现Excel的10个常用功能的示例详解

    SQL实现Excel的10个常用功能的示例详解

    SQL,数据分析岗的必备技能,你可以不懂Python,R,不懂可视化,不懂机器学习。但SQL,你必须懂。本文为大家总结了SQL实现Excel的10个常用功能的示例代码,感兴趣的可以了解一下
    2022-07-07
  • sql语句示例之case when作为where条件

    sql语句示例之case when作为where条件

    这篇文章主要给大家介绍了关于sql语句示例之case when作为where条件的相关资料,在SQL语句中CASE WHEN子句是根据条件表达式的结果来执行不同的逻辑操作,它使用在WHERE子句中,以根据特定的条件在查询结果中过滤数据,需要的朋友可以参考下
    2023-08-08
  • Mysql去重的几种方式分步讲解

    Mysql去重的几种方式分步讲解

    SQL去重是数据分析工作中比较常见的一个场景,下面这篇文章主要给大家介绍了关于SQL去重的3种实用方法的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • MySQL AUTO_INCREMENT 主键自增长的实现

    MySQL AUTO_INCREMENT 主键自增长的实现

    本文主要介绍了MySQL AUTO_INCREMENT 主键自增长的实现,每增加一条记录,主键会自动以相同的步长进行增长,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • MYSQL插入处理重复键值的几种方法

    MYSQL插入处理重复键值的几种方法

    当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍。
    2012-09-09
  • My Sql 1067错误与编码问题的解决方案

    My Sql 1067错误与编码问题的解决方案

    My Sql 大部分都是用绿色版(解压版) 然后注册服务简单方便,但是配置文件也很让人纠结,下面小编给大家带来了My Sql 1067错误与编码问题的解决方案,感兴趣的朋友参考下吧
    2016-11-11
  • mysql id从1开始自增 快速解决id不连续的问题

    mysql id从1开始自增 快速解决id不连续的问题

    这篇文章主要介绍了mysql id从1开始自增 快速解决id不连续的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • MySQL 逻辑备份与恢复测试的相关总结

    MySQL 逻辑备份与恢复测试的相关总结

    数据库逻辑备份就是备份软件按照我们最初所设计的逻辑关系,以数据库的逻辑结构对象为单位,将数据库中的数据按照预定义的逻辑关联格式一条一条生成相关的文本文件,以达到备份的目的。本文将具体介绍MySQL 逻辑备份的相关概念及如何做恢复测试。
    2021-05-05

最新评论