当前位置: 代码网 > it编程>数据库>Mysql > MySQL报错sql_mode=only_full_group_by的问题解决

MySQL报错sql_mode=only_full_group_by的问题解决

2025年02月08日 Mysql 我要评论
报错信息datagrip 报错还原[42000][1055] expression #1 of select list is not in group by clause and contains n

报错信息

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'

注意:

  • 不能有多余的符号,我之前在结尾加了分号导致重启失败。
  • 点击保存文件,不要直接关掉。 不然设置丢失,是不会生效的。

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f6c6cb0048814855854fefede42f0be4.png

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com