隔着屏幕轻易产生感情的你,肯定很孤独吧。

后后记:
以下方法虽然便捷,但是毕竟不符合mysql的初心,所以我们修改自己的sql语句会更好一点。
首先我们要明确查询的字段需要和group的字段一致,如果没办法一致,那么多余的字段需要用聚合函数包裹,比如说sum、avg、max、min、count,如果实在没办法包裹,建议写俩sql 或者用别的方法来查询需要的数据(比如distinct 去重,或者group_concat连接不在组里的字段)=。=

一般出现这种问题的报错信息都是一样的,比如:
[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
才可以



0 条评论

发表评论

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

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