MySQL异常sql_mode=only_full_group_by

一、异常描述

在这里插入图片描述

### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'quality_training.u.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by ### The error may exist in cn/org/gdsxzlg/mapper/UserInfoMapper.java (best guess) ### The error may involve cn.org.gdsxzlg.mapper.UserInfoMapper.listByRegionId-Inline ### The error occurred while setting parameters ### SQL: SELECT u.* FROM user_info u LEFT JOIN study_progresses s ON u.`user_id` = s.`user_id` WHERE (s.`course_id` = 1) GROUP BY s.`user_id`,s.`course_id` ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'quality_training.u.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by ; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'quality_training.u.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

二、异常原因

MySQL 5.7.5后only_full_group_by成为sql_mode的默认选项之一,这可能导致一些sql语句失效。

三、解决办法

这个异常如果是普通环境(mysql直接装在宿主机上)是很好解决的,直接找到mysql的配置文件,修改个配置然后重启mysql服务就好了。但是基于docker容器技术下就稍微复杂了一点。以下提供三种解决方法:

  1. 把group by字段group_id设成primary key 或者 unique NOT NULL。这个方法在实际操作中没什么意义。
  1. 使用函数any_value把报错的字段name包含起来。如,select any_value(name), group_id from game group by group_id。这种对代码有侵入性,如果很多地方用了group by改起来也麻烦,所有也不推荐。
  1. 在配置文件my.cnf中关闭sql_mode=ONLY_FULL_GROUP_BY.。
    msqyl的默认配置sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。
    可以把ONLY_FULL_GROUP_BY去掉,也可以去掉所有选项设置成sql_mode=,如果你确信其他选项不会造成影响的话。

知道要配置my.cnf中的sql_mode参数了,下面就详细说一下基于Docker环境下如何去修改mysql的配置文件

第一步:
首先我们要知道mysql默认是读取/etc/mysql/my.cnf这个配置文件的。
在你停掉原本的mysql容器之前不妨先进入mysql容器,看看这个配置文件,如下图,可以发现my.cnf文件还引入了另外两个目录,我们可以自定义一个配置文件,放在以下两个目录的其中一个之中。
在这里插入图片描述
第二步:
由上一步我们知道my.cnf中引入了/etc/mysql/mysql.onf.d/这个目录,那么我们可以在宿主机上的docker-compose.yml所在的目录新建一个名为confd的文件夹,并把这个文件夹挂载到mysql容器的/etc/mysql/mysql.onf.d/目录。
在这里插入图片描述
第三步:
这事我们就可以通过宿主机上的confd目录下的配置文件对mysql容器进行配置了
在这里插入图片描述
第四步:
最重要的一步是,最后一定要删除掉旧的容器之后再重新构建,否则无效。

进入到容器中查看这个配置文件,可以看到sql_mode也修改了
在这里插入图片描述

发布了60 篇原创文章 · 获赞 41 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/aimashi620/article/details/102832618
今日推荐