开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
通过外驱唤醒内驱, 先从每天遇到的bug开始记录, 所以今天又是一篇bug分享, 这个bug其实挺常见的, 因为sql语句并没有严格按照Mysql8以后的规范来写, 那么就一定会遇到这个bug: group by报错.
错误信息
[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains
nonaggregated column '***' which is not functionally dependent on columns in GROUP BY
clause; this is incompatible with sql_mode=only_full_group_by
异常原因
报这个错的原因正如异常中提到的一样, 我们语句里select后面的字段只能是group by后面的, 如果有其他非group by的字段, 就会抛出上述异常.
问题解决
语句解决
如果我们的业务场景和group by的要求正好吻合, 那就皆大欢喜, 不过这种情况也触发不了bug. 言归正传, 如果是业务符合, 然而Sql没写好, 那么就可以改动Sql, 将不符合的字段从select后面删除, 这样就解决了问题.
临时解决
大多数情况下, 业务场景和Mysql的这项规则契合不了, 所以就需要从Mysql的角度来解决问题, 首先是临时解决, 为什么是临时呢? 因为这种办法Mysql重启会立即失效, 并且这种方法只作用于当前session
SELECT @@sql_mode;
-- 关闭ONLY_FULL_GROUP_BY模式
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));
永久解决
那么临时解决太麻烦了, 就需要另一种方法了, 永久解决, 需要重启Mysql哦.
首先找到my.cnf文件夹, 一般在/etc/mysql/my.cnf, 如果是使用安装包解压安装的, 可能就需要看一看安装的文件夹里有没有了.
修改my.cnf 文件
在[mysqld]下添加
sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION'
docker 容器
如果使用docker容器,怎么办呢? 其实和永久解决是一样的, 只是需要进入容器, 然后再重启容器.
使用docker exec -it msyql /bin/bash 进入容器
找到/etc/mysql/my.cnf, 添加上述sql_mode , 然后重启容器即可docker restart mysql.