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

posted @ 2018-04-13 10:30  橙木鱼  阅读(453)  评论(0编辑  收藏  举报