博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL异常sql_mode=only_full_group_by
阅读量:2240 次
发布时间:2019-05-09

本文共 2463 字,大约阅读时间需要 8 分钟。

一、异常描述

在这里插入图片描述

### 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也修改了

在这里插入图片描述

转载地址:http://frqbb.baihongyu.com/

你可能感兴趣的文章
40个Java多线程问题总结
查看>>
Oracle数据库面试题
查看>>
java面试中的智力题
查看>>
本地如何连接hbase数据库
查看>>
Maven出错-Missing artifact org.apache.openejb:openejb-core:jar:4.1.0-SNAPSHOT:test
查看>>
dubbo配置文件xml校验报错
查看>>
eclipse生成export生成jar详解
查看>>
oracle 模糊查询忽略大小写
查看>>
Java项目导出可运行的jar文件
查看>>
Java文件夹操作,判断多级路径是否存在,不存在就创建(包括windows和linux下的路径字符分析),兼容Windows和Linux
查看>>
JAVA读取PROPERTIES配置文件
查看>>
Linux中执行shell脚本的4种方法总结
查看>>
BufferedInputStream(缓冲输入流)详解
查看>>
修改linux文件权限命令:chmod
查看>>
Linux vi/vim编辑器常用命令与用法总结
查看>>
如何使用Git Bash Here,将本地项目传到github上
查看>>
eclipse git控件操作 回退到历史提交 重置 删除(撤销)历史的某次提交
查看>>
Oracle | 给表和字段添加注释
查看>>
java比较日期大小及日期与字符串的转换【SimpleDateFormat操作实例】
查看>>
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence
查看>>