zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    线阵相机、镜头及光源的选型
    查看mysql数据库容量大小
    mysql 表分区操作
    VC++ 全局变量定义
    sql按半小时统计
    sqlserver/mysql按天、按小时、按分钟统计连续时间段数据
    相机光学 接圈
    Excel中如何锁定部分单元格内容不被修改?
    VC++ 捕获不了异常
    mysql 数据库存储路径更改
  • 原文地址:https://www.cnblogs.com/chengmuyu/p/8818720.html
Copyright © 2011-2022 走看看