mysql5.7建表时报错clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by

今天在用自己搭建的mysql去创建的表时候给我弹出一个提示:

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

当时给我整的一脸懵逼,我以为我的SQL写错了,反复检查了下我写的SQL,才发现没啥问题啊。然后刷新了下数据库,发现表又建好了。去百度查了下,原来是sql_model在搞鬼。

执行sql查看sql_model

select @@sql_mode;

得到以下查询结果:

+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

那么原因来了:

MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY)

知道原因了解决起来就很简单咯,去掉就行了。为了方便省事执行全局配置就行:

修改my.cnf配置文件,新增如下配置:

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,OK搞定收工。当然如果偷懒,也可以执行SQL:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 
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';

 


版权声明:本文为zhuwei_clark原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。