• 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

  • 相关阅读:
    css单行排版
    sass安装(windows版)
    php通过post将表单数据保存到数据库实例
    C#-socket简单同步通信学习
    让VS变成彩色码
    VS项目启动后 提示ID为*******的进程当前未运行
    C#实现简单验证码
    API清理xml格式数据
    VS提示-无法启动IIS Express Web服务器-的解决方法
    C#MVC中ztree的简单使用
  • 原文地址:https://www.cnblogs.com/chengmuyu/p/8818720.html
Copyright © 2020-2023  润新知