报错信息
datagrip 报错还原
[42000][1055] expression #1 of select list is not in group by clause and contains nonaggregated column ‘xx库.xx表.id’ which is not functionally dependent on columns in group by clause; this is incompatible with sql_mode=only_full_group_by
navicat 报错还原
1055 - expression #1 of select list is not in group by clause and contains nonaggregated column ‘school.student_100w.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后,mysql的 sql_mode
配置项会默认包含 only_full_group_by
模式,这个配置会严格执行sql92标准。如果代码中含有group by聚合操作,那么select中的列,除了使用聚合函数之外的,如max()、min()等,都必须出现在group by中。
要求:从学生表中,根据班级编号,分组查询班级编号、班级名称。
报错:select 查询的字段和 group by 分组依据的字段不统一。
# select 查询的字段和 group by 分组依据的字段不统一,会报错。 select class_number, class_name from student group by class_number;
调整:将select 查询的字段和 group by 分组依据的字段统一。
# select 查询字段和 group by 分组依据的字段统一后就不会报错。 select class_number, class_name from student group by class_number, class_name ;
# select 查询字段和 group by 分组依据的字段统一后就不会报错。 select class_number from student group by class_number;
解决方案
查看当前 sql mode
执行 sql
语句,查看当前的 sql_mode
。
select @@global.sql_mode;
注意默认的列宽可能无法直接查看全部内容,容易造成误解,需要手动拉伸列宽查看。
拉伸列宽后可查看全部内容,(不同版本的 mysql
默认值可能不同)。
方案一:临时解决
排除当前 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';
但是如果当前数据库重启后,还是回归默认设置,即包含 only_full_group_by
模式。
方案二:永久解决
windows系统,直接修改 my.ini
配置文件。
在 [mysqld]
模块下新增一行配置:
sql_mode='strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution'
注意:
- 不能有多余的符号,我之前在结尾加了分号导致重启失败。
- 点击保存文件,不要直接关掉。 不然设置丢失,是不会生效的。
linux系统,思路是一样的,都是找配置文件修改配置。但是不同mysql版本,路径和配置文件名称可能不同:大致可能是 /etc/my.cnf
或者 /mysql.conf
之类的名称。
数据库重启后生效。
方案三:使用 any_value() 或 group_concat()
- any_value():
- 将分到同一组的数据里第一条数据的指定列值作为返回数据。 (any_value()函数就是mysql提供的用来抑制only_full_group_by值被拒绝的)
select class_number, any_value(class_name) from student group by class_number;
实际使用效果如下:
- group_concat():
- 将分到同一组的数据默认用逗号隔开作为返回数据。
select class_number, group_concat(class_name) from student group by class_number;
实际使用效果如下:
方案四:调整实现思路,避开 group by 使用
通过对sql的查询思路调整,代码逻辑调整等,部分场景是可以绕开对 group by 关键字筛选依赖的。这个需要结合实际业务场景,自己去思考调整了。
到此这篇关于mysql报错sql_mode=only_full_group_by的问题解决的文章就介绍到这了,更多相关mysql sql_mode=only_full_group_by内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论