zoukankan      html  css  js  c++  java
  • SQL Error (1055) sql_mode=only_full_group_by

    报错

    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'aaa.test.age' which is not functionally dependent on columns in GROUP BY clause; 
    this is incompatible with sql_mode=only_full_group_by

    mysql5.1,不报异常

    mysql5.5,不报异常

    mysql5.6,不报异常

    mysql5.7,报异常

    原因

    原因是因为mysql中对 group by 用法的规定。严格意义上说,就是用了group by之后。select 的字段只能是group by的字段,或者需要加聚合函数的。在 oracle 中,一直有这项约定。所以直接就会报错。但是mysql 直到 5.7 版本之后才把这个要求明确限制起来。

    这种问题两种思路:

    第一修改sql,按照规定的规范重写项目中所有有问题的sql。很明显代价太大。风险很高;不过还未开发时可以严格规范写法。

    第二种那就是把这种限制去掉,让功能继续像5.7之前的样子一样能跑。已经完成的项目用这种,因为第一种代价太大。

    解决方法

    1、改写SQL语句,毕竟上面的写法不是标准的SQL语句

    2、登陆mysql服务器,执行以下命令,在global与session级都修改

    mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

    3、结合第2种方法,在my.cnf文件中,指定sql_mode的值:

    [mysqld]
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    注:2与3结合可不用重启服务器,且即使重启配置也依然有效。

  • 相关阅读:
    AngularJS(3)-过滤器
    AngularJS(2)-Scope作用域和控制器
    iOS局部刷新
    python(一)入门
    Java基础
    AngularJS(1)随笔
    mac下如何查看指定端口被谁占用并且杀死该进程
    Python 字节码bytecode
    Python 作用域和命名空间
    Python函数的默认参数的设计【原创】
  • 原文地址:https://www.cnblogs.com/aeolian/p/12401916.html
Copyright © 2011-2022 走看看