【sql_mode=only_full_group_by问题解决方案】

一、问题:

Caused by: java.sql.SQLSyntaxErrorException: Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘supply_heat.record.supply_quality’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
在这里插入图片描述

二、原因:

分析:

  • mysql5.7版本的sql_mode默认包含了ONLY_FULL_GROUP_BY属性,是为保证SELECT的列都出现在group by中。
  • 使用 select @@sql_mode; 或 select @@golbal.sql_mode; 或 select @@session.sql_mode;命令可以看到,数据库设置了 ONLY_FULL_GROUP_BY 的mode
  • 意思就是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中;

三、解决:

方法一:

修改sql,让SELECT列出现在GORUP BY 中,但此方法需将全部的sql代码检查修改一遍,工作量较大

方法二:

去掉去掉ONLY_FULL_GROUP_BY,并重新设置值。

//1.登录mysql
[root@aa#] mysql -u root -p
[root@aa#] password
//2.查看sql_mode
mysql> select @@sql_mode
//3.设置新值
mysql> SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
//4.更新已存在的数据库的sql_mode
mysql> SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
//5.退出重启mysql
方法三:

修改my.cnf配置文件:

  1. 找到mysql的配置文件my.cnf
  2. 修改文件中sql_mode
  3. 重启mysql

注意:

  • 对于centos,my.cnf中直接去掉sql-mode中的ONLY_FULL_GROUP_BY即可
  • 对于ubuntu,my.cnf中没有sql-mode,直接在配置文件最后加上sql-mode=sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • 对于windows,修改my.ini文件
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值