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

  • 相关阅读:
    可能用到的两款Linux工具tmux和tpp
    CCF技术动态第68期(云计算专题)...中国云计算发展概况与趋势...
    产生随机数//NULL大写,rand()在cstdlib,不在cmath
    28个Unix/Linux的命令行神器
    oAuth无痛入门指南
    CRM 客户关系管理和云计算...Salesforce企业级云计算的领导者...
    博客终于开通了
    传递与引用
    Java基础概念
    final、finally和finalize(二)
  • 原文地址:https://www.cnblogs.com/chengmuyu/p/8818720.html
Copyright © 2011-2022 走看看