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