美文网首页
Mysql 错误“1055”

Mysql 错误“1055”

作者: 五岁小孩 | 来源:发表于2020-07-29 14:51 被阅读0次

<center><font size='5' color='#fff'>错误“1055”</font></center>

  • 错误

    mysql>SELECT * FROM `user_resource`
          WHERE (1=1) GROUP BY CouId,UsrId ORDER BY CouId asc LIMIT 10 OFFSET 0 ;
    

    出错:

    ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause 
    and contains nonaggregated column 'eascs_eatp.user_resource.ResId' which is not functionally 
    dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    
  • 原因

    问题原因: 
    ONLY_FULL_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,
    那么这个SQL是不合法的,因为列不在GROUP BY从句中,
    也就是说查出来的列必须在group by后面出现,否则就会报错,或者这个字段出现在聚合函数里面。 
    
    在MySQL5.7之后,sql_mode中默认存在ONLY_FULL_GROUP_BY,
    SQL语句未通过ONLY_FULL_GROUP_BY语义检查所以报错。
    
  • 解决方法1[^该方法是短期的,退出Mysql操作后失效,永久实现参考方法2]

查询sql_mode

第一项默认开启ONLY_FULL_GROUP_BY了,导致出现了错误,需要把它的默认关掉。

mysql> SELECT @@GLOBAL.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

删除(重新设置):

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

Query OK, 0 rows affected (0.01 sec)
  • 重新查询

    mysql> SELECT @@GLOBAL.sql_mode;
    +-----------------------------------------------------------------------------------------------------------------------+
    | @@GLOBAL.sql_mode                                                                                                     |
    +-----------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
    +-----------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> SELECT * FROM `user_resource`  WHERE (1=1) GROUP BY CouId,UsrId ORDER BY CouId asc LIMIT 10 OFFSET 0;
    +-------+-----------+----------+-------------+---------------------+---------------------+-------+
    | UsrId | ResId     | CouId    | CanDownload | ExpTime             | AddTime             | AccId |
    +-------+-----------+----------+-------------+---------------------+---------------------+-------+
    |   667 | 324243746 | cxcy     |           9 | 2020-03-02 16:55:00 | 2020-03-02 16:55:00 | admin |
    |   667 | 324243645 | gyldsj   |           9 | 2020-03-02 16:56:00 | 2020-03-02 16:56:00 | admin |
    |   667 | 324243449 | gyljr    |           9 | 2020-03-02 16:56:00 | 2020-03-02 16:56:00 | admin |
    |   667 | 324243547 | gyljwlgl |           9 | 2020-03-02 16:56:00 | 2020-03-02 16:56:00 | admin |
    |   667 | 324243718 | xls      |           9 | 2020-03-02 16:57:00 | 2020-03-02 16:57:00 | admin |
    +-------+-----------+----------+-------------+---------------------+---------------------+-------+
    5 rows in set (0.00 sec)
    
  • 解决方法2[^永久]

    进入mysql查询sql_mode

      mysql> SELECT @@GLOBAL.sql_mode;
      +-----------------------------------------------------------------------------------------------------------------------+
      | @@GLOBAL.sql_mode                                                                                                     |
      +-----------------------------------------------------------------------------------------------------------------------+
      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
      +-----------------------------------------------------------------------------------------------------------------------+
      1 row in set (0.00 sec)
      
    

    复制然后去除ONLY_FULL_GROUP_BY,如下:

    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

    linux环境下,vim到my.cnf(我的my.cnf是 cd /etc)

    #添加刚刚复制的代码
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,
        NO_ENGINE_SUBSTITUTION 
    

    重启服务器:

    service mysqld restart
    

相关文章

网友评论

      本文标题:Mysql 错误“1055”

      本文链接:https://www.haomeiwen.com/subject/bezfrktx.html