MySQL中sql_mode=only_full_group_by问题解决办法


1.ONLY_FULL_GROUP_BY解析

对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,也没有使用聚合函数,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
简而言之,就是SELECT后面接的列必须被GROUP BY后面接的列所包含,或者该列被使用聚合函数(sum等)。如:

select a,b,c from table group by a,b; (错误)
select a,b from table group by a,b,c; (正确)
select a,b,sum(c) from table group by a,b;(正确)

2.取消ONLY_FULL_GROUP_BY配置

1.临时修改,重新设置sql_mode,服务重启后将失效

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.永久修改,修改mysql配置文件,通过手动添加sql_mode的方式强制指定不需要ONLY_FULL_GROUP_BY属性

在 [mysqld] 下面添加代码:

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的配置文件名及路径不同:

  • Mac或Linux文件 /etc/my.cnf
  • Windows在数据库安装目录下的 my.ini

文章作者: niww
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 niww !
 上一篇
跨域解决方案---CORS 跨域解决方案---CORS
一、什么是跨域访问说到跨域访问,必须先解释一个名词:同源策略。所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同、Host(ip)相同、端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问。虽然跨域访问被禁止之
2019-09-18
下一篇 
Nginx常用命令 Nginx常用命令
sudo nginx #打开 nginxnginx -s reload|reopen|stop|quit #重新加载配置|重启|停止|退出 nginxnginx -t #测试配置是否有语法错误 nginx [-?hvVtq] [-s
2019-03-16
  目录