sql mode 问题及解决 错误代码:1055 this is incompatible with sql_mode=only_full_group_by

数据库升级到5.7.21后,一个正常的分组后按日期排序,并返回数据的语句开始报错:

语句如下:

SELECT id,title,add_time FROM `message` GROUP BY add_time ORDER BY add_time DESC;

异常如下:

错误代码: 1055
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'miniodb.nhb_message.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

出现这个异常的原因是MYSQL5.7.5之后开启了原来默认关闭的SQL mode:ONLY_FULL_GROUP_BY.开启这个模式会造成mysql拒绝查询非聚合操作列,即没有通过group by进行分组的列,无法直接在select,having,order by条件下使用;

解决方式有三种:

1 直接将版本降级到5.7.5以下,简单粗暴,但就是有点low;

2 使用ANY_VALUE()方法显示非聚合列;这个方法将聚合操作还原为5.7.5之前版本;

  使用方式:

SELECT ANY_VALUE(id),ANY_VALUE(title),add_time FROM `message` GROUP BY add_time ORDER BY ANY_VALUE(add_time) DESC;

3 最终,如果没有替代方法,再修改SQL mode;

# 修改
SET GLOBAL sql_mode = 'modes'; #需要超级权限,会影响修改后的所有连接客户端
SET SESSION sql_mode = 'modes'; #只影响当前客户端,可以随时修改
# 查询
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

修改SQL mode会影响用户分区表:

如果在分区表中有数据的情况下,修改SQL mode会导致表行为发生重大变化,可能导致数据损坏或丢失.官方建议在使用用户分区表后,不要修改SQL mode;

主从复制情况下,要注意保证主从服务器的SQL mode一致;

 

 参考文档:

  MYSQL服务器SQL Mode: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

  MYSQL的GROUP BY处理: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

转载于:https://www.cnblogs.com/chengmuyu/p/8818720.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值