MySQL报错only_full_group_by

MySql从5.7版本开始默认开启only_full_group_by规则,规则核心原则如下,没有遵循原则的sql会被认为是不合法的sql

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

如果使用了大于5.7的版本,又使用的group_by,可能会碰到这个问题;为了纠正这个问题,有两个办法

  • 修改自己的SQl语句
  • 关闭only_full_group_by规则

这里,只介绍第二个方法,即关闭only_full_group_by规则
首先,查看数据库的规则

SELECT @@GLOBAL.sql_mode;

结果是

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
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';

单引号中的,就是去掉ONLY_FULL_GROUP_BY以后的规则

设置以后,重启一下我们的程序,重新连接一次数据库,就会生效
但如果数据库重启,规则需要重新设置

你可能感兴趣的:(MySQL报错only_full_group_by)