Ubuntu 16.04下MySQL 5.7.20仅全分组模式查询报错如何解决?
解决MySQL
only_full_group_by 报错问题 这个问题我碰到过好多次了!本质是MySQL 5.7及以后版本默认开启了ONLY_FULL_GROUP_BY这个SQL模式,它对GROUP BY查询的规范性要求更严格:SELECT列表里的非聚合列必须要么出现在GROUP BY子句中,要么功能依赖于GROUP BY里的列。你本地环境没开这个模式,所以查询能正常跑,但服务器上的MySQL默认启用了该模式,就触发了这个错误。
下面给你三种解决方案,按需选择:
1. 临时关闭该模式(重启MySQL后失效)
适合快速测试场景,不用修改配置文件:
- 登录MySQL服务器:
mysql -u root -p - 执行全局模式修改:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); - 给当前会话同步设置(避免重新登录):
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); - 验证是否生效:执行
SELECT @@sql_mode;,输出内容里看不到ONLY_FULL_GROUP_BY就说明设置成功了。
2. 永久关闭该模式(修改配置文件,重启生效)
适合长期解决问题,不会因为MySQL重启失效:
- 找到Ubuntu 16.04上的MySQL配置文件,通常是
/etc/mysql/mysql.conf.d/mysqld.cnf(如果找不到可以用find /etc/mysql -name "*.cnf"命令查找) - 打开文件,定位到
[mysqld]段落,添加或修改sql_mode配置:
[mysqld] # 保留其他原有配置,只修改sql_mode 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不要包含ONLY_FULL_GROUP_BY
- 保存文件后重启MySQL服务:
sudo systemctl restart mysql - 再次登录MySQL验证:执行
SELECT @@sql_mode;确认设置已生效。
3. 修改查询语句(最规范的做法,推荐)
从根源上符合SQL标准,避免依赖模式设置:
- 把SELECT列表中所有非聚合的列都添加到GROUP BY子句里。比如你报错里的
billpaidde6_.id,如果它不在GROUP BY里,就需要补充进去。 - 举个例子:
原来的错误查询:
修改后符合规范的查询:SELECT col1, col2, SUM(col3), billpaidde6_.id FROM your_table GROUP BY col1;SELECT col1, col2, SUM(col3), billpaidde6_.id FROM your_table GROUP BY col1, col2, billpaidde6_.id; - 如果GROUP BY的是表的主键,理论上其他列都功能依赖于主键,MySQL会允许这种情况,但如果你的GROUP BY字段不是主键,就必须显式列出所有非聚合列。
另外补充一句:你本地环境没问题,大概率是本地MySQL版本低于5.7,或者手动关闭了ONLY_FULL_GROUP_BY模式,而服务器上的MySQL 5.7默认启用了这个严格模式。
内容的提问来源于stack exchange,提问作者xrcwrn
相关产品推荐
相关产品推荐

