翼度科技»论坛 编程开发 mysql 查看内容

如何解决MySQL this is incompatible with sql_mode=only_full_group_

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
MySQL this is incompatible with sql_mode=only_full_group_by


代码示例:
在MySQL中,
  1. ONLY_FULL_GROUP_BY
复制代码
是一个SQL模式设置,它要求在使用
  1. GROUP BY
复制代码
时,
  1. SELECT
复制代码
语句中引用的所有列必须在
  1. GROUP BY
复制代码
子句中明确指定,或者是聚合函数的一部分。
这个模式的目的是为了防止产生不确定的查询结果。
如果你遇到了
  1. ONLY_FULL_GROUP_BY
复制代码
的错误,以下是一些解决方案:

1.修改SQL语句


  • 确保
    1. SELECT
    复制代码
    列表中的所有列要么包含在
    1. GROUP BY
    复制代码
    子句中,要么作为聚合函数的一部分。
  • 例如,如果你的查询是这样的:
  1. SELECT column1, column2 FROM table GROUP BY column1;
复制代码

  • 你需要将
    1. column2
    复制代码
    也加入到
    1. GROUP BY
    复制代码
    子句中
  • 或者对
    1. column2
    复制代码
    使用聚合函数
    1. MAX(column2)
    复制代码
    1. SUM(column2)
    复制代码

2.使用聚合函数


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


3.禁用ONLY_FULL_GROUP_BY


  • 你可以在会话级别或全局级别禁用
    1. ONLY_FULL_GROUP_BY
    复制代码

  • 这可以通过以下命令完成:
  1. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
复制代码

  • 或者,你可以修改MySQL的配置文件(例如
    1. my.cnf
    复制代码
    1. my.ini
    复制代码

  • 去掉
    1. ONLY_FULL_GROUP_BY
    复制代码

  1. [mysqld]
  2. 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()函数


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

5.永久修改sql_mode


  • 在某些情况下,如果你不希望每次重启MySQL服务后都要重新设置
    1. sql_mode
    复制代码
    ,你可以将更改永久化到MySQL的配置文件中。
  • 请注意,禁用
    1. ONLY_FULL_GROUP_BY
    复制代码
    可能会让你的查询结果变得不确定,因为MySQL将不再强制要求
    1. GROUP BY
    复制代码
    子句包含所有非聚合列。
  • 因此,在禁用这个模式之前,最好先评估一下它对你的查询逻辑和结果的影响。
如果你正在使用MySQL 8.0或更高版本,并且尝试修改
  1. sql_mode
复制代码
时遇到了问题,比如出现了错误:
  1. ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'
复制代码

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


总结

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

来源:https://www.jb51.net/database/331030kab.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具