每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by

1. 问题如下

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘student.name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

查看MySql的版本

select version();

2. 查看sql_mode中的内容

select @@GLOBAL.sql_mode;

3. 原因

mysql5.7 以上默认开启了only_full_group_by选项。我的版本是mysql5.7.27的

看一下group by的语法:

select 选取分组中的列+聚合函数 from 表名称 group by 分组的列 

从语法格式来看,是先有分组,再确定检索的列,检索的列只能在参加分组的列中选。

我当前Mysql版本5.7.27,

再看一下ONLY_FULL_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,也就是说查出来的列

必须在group by后面出现否则就会报错,或者这个字段出现在聚合函数里面。

4. 解决办法有两种,第一种是临时解决,数据库重启还会重新出现此问题,第二种是修改mysql的配置文件

4.1 Windows解决办法

方法1:

将查询到的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';

方法2:

先找到自己mysql安装路径

select @@basedir;

然后进入文件夹找到自己的 my.ini 配置文件,修改 [mysqld] 中的内容,添加下面的内容就可以,然后退出数据库,在服务里面重启MySQL就可以

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

4.2 Linux解决办法:

方法1:

将查询到的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';

方法2:

linux上的mysql 的配置文件不叫 my.ini,配置文件在 /etc/my.cnf

vim /etc/my.cnf

修改 [mysqld] 中的内容,添加下面的内容就可以,然后重启MySQL就可以

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

 重启Mysql命令

service mysql restart
posted @ 2021-12-23 14:51  helloliyh  阅读(2104)  评论(0编辑  收藏  举报