一、问题:
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配置文件:
- 找到mysql的配置文件my.cnf
- 修改文件中sql_mode
- 重启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文件