MySql 配置 sql_mode=only_full_group_by

16 阅读1分钟
Caused by: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx.workflowta0_.ID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916) ~[mysql-connector-j-8.0.33.jar:8.0.33]
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:972) ~[mysql-connector-j-8.0.33.jar:8.0.33]

月黑风高加班夜,调用一老哥提供的接口,花十分钟运行起来的项目,花了一秒钟就报错了,淦....

找到他的sql语句

<query name="QUERY_BY_PROCESSINSTANCEID_NODEID"><![CDATA[from com.workflow.entity.WorkflowTask where processInstance.id = :processInstanceId and nodeId = :nodeId GROUP BY parentId]]></query>

我心想从开始看 《mysql从入门到放弃》教的就是 GROUP BY 后接什么字段就只能查询什么字段,其余字段值需要套函数。什么意思:按照上边的例子来说就是查询字段中除了parentId,其余要查询的字段需要用max(),min(),count() 这种函数进行处理

GROUP BY 相当于是在满足条件的数据中,根据字段进行分组,假如有两条数据

姓名性别
小明
小强
select 姓名,性别 from xxx group by 性别
按照性别男 分组后,姓名有两条,该展示哪条得明确一下,就需要套个函数

老哥说在他那不报错 问了老哥的mysql版本,查了下资料

从MySQL 5.7.5版本开始,默认的sql_mode包含了ONLY_FULL_GROUP_BY模式,要求GROUP BY查询中的SELECT列表、HAVING条件或ORDER BY列表中的列必须出现在GROUP BY子句中或者是聚合函数的一部分

如果mysql版本大于等于 5.7.5,解决办法有

解决办法

方案1:按照要求规范sql语法 方案2:修改sql_mode的值

  • SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))
  • 修改my.ini配置 [mysqld] sql_mode=