当前位置: 代码网 > it编程>数据库>Mysql > MySQL出现错误代码:1055的三种解决方案(推荐!)

MySQL出现错误代码:1055的三种解决方案(推荐!)

2024年06月10日 Mysql 我要评论
一、 mysql版本mysql版本:8.0.11二、 问题描述1. 问题描述在查询时使用group by语句,出现错误代码:1055;执行发生错误语句:select t1.id, t1.`room

一、 mysql版本

  • mysql版本:8.0.11

二、 问题描述

1. 问题描述

  • 在查询时使用group by语句,出现错误代码:1055;
  • 执行发生错误语句:
select
  t1.id,
  t1.`room_name`,
  t2.`room_id`,
  t2.`name`
from
  room t1
  left join person t2
  on t1.id = t2.room_id 
group by t1.id

结果:

在这里插入图片描述

  • 上图说 select表达式#4-t2.name不是聚合函数列,没有依赖group by 子句中的列,所以导致报错

2.only_full_group_by-sql示例

  • 在mysql5.7之后sql_mode中默认存在only_full_group_by,sql语句未通过only_full_group_by语义检查所以报错。
  • only_full_group_by:要求select语句中所查询出的列必须是在group by中进行声明,否则就会报错。简单的说来,在此模式下,select target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值。
-- 执行成功,因为select语句中的count()是聚集函数;
select
   count(1)
from
   room t1
   left join person t2 on t1.id = t2.room_id
group by 
   t2.name;

-- 执行失败,因为*中包含主键id,而group by后的表达式中并没有包含两张表中的id
select
	* 
from
	room t1
	left join person t2 on t1.id = t2.room_id 
group by
	t2.name
	
-- 执行成功,将上句sql改为如下:
select
	* 
from
	room t1
	left join person t2 on t1.id = t2.room_id 
group by
	t1.id,
	t2.id

-- 执行成功,因为t2.name包含在group by后的表达式中   
select
	t2.name 
from
	room t1
	left join person t2 on t1.id = t2.room_id 
group by
	t2.name

-- 该sql执行失败,因为contact没有包含在group by后的表达式中
select
  t2.name,
  t2.room_id
from
  room t1
  left join person t2
    on t1.id = t2.room_id
group by t2.name
    

三、解决办法

1.方法一

这种方法不需要修改任何配置文件,给不需要分组的字段上加上 any_value() 函数即可。

any_value:选择被分到同一组数据中的第一条数据的指定列值作为返回数据。

示例:

select
  t2.name,
  any_value(t2.room_id) as room_id
from
  room t1
  left join person t2
    on t1.id = t2.room_id
group by 
	t2.name

当然,这种对于已经开发了不少功能的项目不太合适,毕竟要把原来的sql都给修改一遍

2.方法二(临时)

这种方法只能暂时解决1055错误,当mysql服务进行重启后就会失效,又得重新设置;

查询出所有的 sql_mode

select @@sql_mode

在这里插入图片描述

然后将查询结果中的only_full_group_by移除后,再重新设置sql_model

set sql_mode = 'strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution'
  • 操作执行完成后就ok了

3.方法三(永久)

  • 直接通过修改mysql的my.ini文件(如果是linux则在my.cnf中),这样就算mysql服务重启后也不会失效;

在这里插入图片描述

在my.ini文件中添加:

# 设置sql_mode,关闭only_full_group_by,避免使用group by函数导致1055错误
sql_mode=strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution

在这里插入图片描述

重启mysql服务就ok,以管理员身份打开cmd窗口输入命令(不然可能会拒绝访问);

## 关闭mysql服务
net stop mysql 
## 开启mysql服务
net start mysql

四、sql_mode常用值

  1. only_full_group_by:在select中的列,没有在group by中出现,那么将认为这个sql是不合法的,因为列不在group by从句中,即只能展示group by的字段,其他均都要报1055的错;
  2. strict_trans_tables:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制;
  3. no_auto_value_on_zero:影响自增长列的插入。默认设置下,插入0或null代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
  4. no_zero_in_date: 在严格模式下,不接受部分为0的日期。如果使用ignore选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。
  5. no_zero_date:在严格模式下,mysql数据库不允许插入零日期。它实际的行为受到 strictmode是否开启的影响2。
  6. error_for_division_by_zero:在insert或update过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时mysql返回null
  7. no_auto_create_user:禁止grant创建密码为空的用户
  8. no_engine_substitution:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
  9. pipes_as_concat:将”||”视为字符串的连接操作符而非或运算符,这和oracle数据库是一样的,也和字符串的拼接函数concat相类似
  10. ansi_quotes:启用ansi_quotes后,不能用双引号来引用字符串,因为它被解释为识别符

以上就是mysql出现错误代码:1055的三种解决方案(推荐!)的详细内容,更多关于mysql错误代码1055的资料请关注代码网其它相关文章!

(0)

相关文章:

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

发表评论

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