MySQL报错only_full_group_by的解决办法

MySQL 5.7以后,默认开启了only_full_group_by规则,规则的核心原则如下:

  • order by后面的列必须是在select后面存在的
  • select、having或order by后面存在的非聚合列必须全部在group by中存在

现在使用的MySQL 8.0全有这个问题,这个问题有三个解决办法:

  • 修改sql语句,使其遵守only_full_group_by规则
  • 将MySQL版本降低到5.7以下
  • 关闭only_full_group_by规则

第一种修改起来麻烦,而且,有时候,会无法满足需求;
第二种降低版本,肯定是不行的
这里介绍第三种:

下以两行用来查询是否有only_full_group_by规则

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

这是返回结果

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

我们重新设置,把ONLY_FULL_GROUP_BY去掉即可,代码如下

set @@GLOBAL.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
set @@SESSION.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

然后,需要重启数据库

service mysqld stop;
service mysqld start;

自己测试中发现,重启以后,这个mode会复原,反复操作了几次才有效

你可能感兴趣的:(MySQL报错only_full_group_by的解决办法)