MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by)

背景:前段时间项目迁移了数据库,测试发现接口中的SQL执行报错。

单独执行SQL竟然失败了。(如下图)


MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by)_第1张图片
iSQL报错截图.png

发现是由于sql_mode的类型为ONLY_FULL_GROUP_BY导致group的语句失败了。
报错信息为SELECT后面查询的字段都要放到GROUP BY后面。

查看迁移后的数据的sql_mode。


MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by)_第2张图片
查看sql_mode.png

在筛查过程中,发现有一条SQL在SELECT后面的字段没有都放到GROUP BY后面,也可以正常执行。
仔细审视这条SQL发现GROUP BY后面的字段表的主键。


MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by)_第3张图片
正常执行的截图.png

换一条SQL来验证下,确实如此。


MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by)_第4张图片
i主键可以.png

GROUP BY后面有多个字段的意思,就是多个字段不同时一致的时候进行分组。


MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by)_第5张图片
多个字段的含义.png

最初的那条SQL修改后可以正常执行了(就是把查询的字段都放到GROUP BY后面了)。


MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by)_第6张图片
最后处理的结果.png

修改SQL_MODE的办法
1.数据库直接修改。

##去掉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';

##上面是改变了全局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';

2.更改配置文件my.ini

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

小结
SQL_MODE的意义就是定义了你MySQL应该支持的sql语法。

ONLY_FULL_GROUP_BY对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的。

根据情况选择修改SQL还是修改sql_mode。

注:mysql5.7.x及以上版本,默认是开启了 only_full_group_by 模式的。

你可能感兴趣的:(MySql中的sql_mode(this is incompatible with sql_mode=only_full_group_by))