<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
网友评论