👩🏽💻个人主页:阿木木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;
四、结尾
感谢观看至此,希望该文章能够帮助到您提升知识和技能。如果您喜欢我的内容,请不要忘记点赞和分享哦!👍