记一次Mysql8.0使用GROUP BY查询导致异常问题

423 阅读3分钟

👩🏽‍💻个人主页:阿木木AEcru (更多精彩内容可进入主页观看)

🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》

💹每一次技术突破,都是对自我能力的挑战和超越。

前言

看标题我相信大家都会有个疑惑,用个GROUP BY 查询怎么还会出问题?这不是很常见的一个查询语句吗?带着疑惑继续往下看吧。

一、错误信息

我们先来看看错误信息

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'toolkit.user.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

错误信息中有提到 sql_mode=only_full_group_by 这个模式。

二、异常出现的原因

查询当前数据库的sql_mode配置

select @@GLOBAL.sql_mode;

ONLY_FULL_GROUP_BY 模式在 MySQL 5.7 版本开始默认开启。这个模式的引入是为了更严格地遵守 SQL92 标准中的 GROUP BY 子句规则。在该模式下,如果查询中使用了 GROUP BY 子句,那么 SELECT 列表中的所有非聚合列都必须在 GROUP BY 子句中明确指定,或者使用聚合函数进行处理。如果在升级到 MySQL 5.7 或更高版本后遇到与 ONLY_FULL_GROUP_BY 相关的错误,可能需要修改 SQL 查询或调整 MySQL 的 sql_mode 配置来解决兼容性问题。

三、解决方法

3.1 方式一:修改sql语句解决

使用 ANY_VALUE() 函数运用用在 GROUP BY 子句中没有的字段。 这样在sql层面上就可以修复这个问题,当然这个也是临时解决而已,这种方式就不太推荐。

3.2 方式二:修改sql_mode配置

修改全局sql_mode

需要注意的是这个全局设置只对后续新建的数据库有效。

SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

修改已有数据库的sql_mode

SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

这种方式也会存在一个弊端,就是当数据库重启的时候,这个配置就失效了,需要重新执行来配置。

3.3 方式三:修改MySQL配置文件

推荐使用这种方式,可以一劳永逸,不过需要重启数据库

首先找到配置文件/etc/my.cnf或者/etc/mysql/my.cnf

找到配置文件中的[mysqld]配置,在下面添加上以下配置

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

如上图所示

配置完成后重启mysql即可

sudo service mysql restart

重启完成后可以再次查询一次当前数据看sql_mode信息看下是否有生效。

select @@GLOBAL.sql_mode;

四、结尾

感谢观看至此,希望该文章能够帮助到您提升知识和技能。如果您喜欢我的内容,请不要忘记点赞和分享哦!👍

往期内容推荐

链接
Linux部署MySQL8.0—手把手保姆级教程 - 掘金 (juejin.cn)
保姆级教程手把手教你如何快速部署一个属于你自己的微信AI机器人-支持群聊 - 掘金 (juejin.cn)
还在用if校验参数?SpringBoot使用validation优雅实现参数校验 - 掘金 (juejin.cn)
Docker三分钟部署ElasticSearch平替MeiliSearch轻量级搜索引擎 - 掘金 (juejin.cn)
Java使用Hutool工具类轻松生成验证码 - 掘金 (juejin.cn)