使用 GROUP BY 时抛出 only_full_group_by 异常
更多精彩
- 更多技术博客,请移步 IT人才终生实训与职业进阶平台 - 实训在线
问题
- 通过 GROUP BY 查询时抛出下列异常
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决
当前会话生效
- 在数据库可视化工具中输入以下脚本
- 但只能当前会话生效,通过其他会话访问时依旧抛出异常,没有任何效果
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
配置全局生效
可以找到 my-defauilt.cnf
- 一般网上各种关于这个问题的帖子,基本都会提到 my-default.cnf 这个文件,这是通过 Homebrew 安装 MySQL 后会在指定目录下生成的默认文件
- 如果能在
/usr/local/opt/mysql/support-files/
目录下找到该文件 - 则直接运行
cp /usr/local/opt/mysql/support-files/my-default.cnf /etc/my.cnf
将该文件复制到/etc/
目录下,并重命名为 my.cnf - 输入
vi /etc/my.cnf
,在文件最末尾添加如下脚本- 注意该脚本和第一种解决方式中脚本的区别,等号后面的部分没有被单引号包裹,而且末尾没有分号
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
- 退出并保存文件后,输入如下脚本重启数据库即可
brew services stop mysql
brew services start mysql
找不到 my-default.cnf
- 上一个解决方法是我之前碰到问题是记录的,当时确实可以在对应目录找到默认配置文件,但这次换电脑重装了 8.x 版本的 MySQL ,在任何目录都找不到该文件
- 所以才有了以下解决办法,参考自 For homebrew mysql installs, where’s my.cnf? - Stack Overflow
- 在终端输入
sudo /usr/libexec/locate.updatedb
- 会需要等待一段时间,命令会自动执行完成
- 之后输入
locate my.cnf
,就会在命令下方输出初始化的 my.cnf 所在目录,如下图
image
- 输入
vi /usr/local/etc/my.cnf
,在文件末尾添加上一个解决方法相同的脚本 - 退出保存后重启数据库即可
网友评论