一般出现这种问题的报错信息都是一样的,比如:
[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘*****’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
这种情况一般在mysql5.7以上版本较为容易出现,mysql 5.7版本默认包含了only_full_group_by属性,是为了保证了select到的列都在group by中出现。我们可以查看所有的sql_mode的属性:

select @@GLOBAL.sql_mode;

一般性解决方法是:

set @@sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

但是这个不适用于已建立的数据库,已建立数据库需要用如下命令修改:

set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

我以前用下面的方法修改,后来使用了上面第二种

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之后仍会还原,最好的办法有两种
一. 在sql查询语句中不需要group by的字段上使用any_value()函数(呵呵)
二. 第二种方法比较好点,就是修改my.ini文件(my.cnf),只需要在配置文件里[mysqld]下修改sql_mode的值,删掉only_full_group_by一项即可,若配置文件里面没有sql_mode配置(ubuntu会出现该问题),只需要手动增加一条就好

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服务即可
systemctl restart mysqld

后记:
mysql8.0版本已经取消了NO_AUTO_CREATE_USER关键字,所以8.0以上的版本添加
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
才可以


发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据