mysql5.7 版本 only_full_group_by 导致原 sql 语句报错
报错代码:
1055 - Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'table.starttime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
报错原因:
mysql5.7 版本之后only_full_group_by字段就为真;字面意思就是 select 后面查询的字段没有出现在 group by 中,导致报错。
核心原则:① select、having 或 order by 后面存在的非聚合列必须全部在 group by 中存在; ② order by 后面的列必须是在 select 后面存在的
问题解决方案:
### 第一种方案: 去掉only_full_group_by规则配置 ### 第二种方案: 修改业务sql语句使其遵守only_full_group_by规则 ### 第三种 mysql版本降到5.7以下版本
第一种方案:推荐使用;原因相对来说风险较小简单操作,如下:
## 查看下SQL的模式
mysql> show variables like '%sql_mode%'; -- 第一个指令
mysql> SELECT @@sql_mode; -- 第二个指令
mysql> SELECT @@GLOBAL.sql_mode; --第三个指令
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
说明本地的mysql是开启了规则校验
### 关闭only_full_group_by的规则校
① set sql_mode = ''
或者
set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
或者
set @@GLOBAL.sql_mode= 'xxx' set @@SESSION.sql_mode= 'xxx'
#### 注意事项
此设置只针对你当前修改生效,一旦mysql重启以后则会被立即还原的;需要到mysql的配置文件中增加次选项,然后重启生效。
第二种方案:如果是新项目推荐使用,则改动较小;如是就项目升 mysql 版本,基本上项目 sql 没有遵循 only_full_group_by 规则,修改成本较高,且需要测试介入全面测试,人力成本在这里;且存在潜在测不到的问题
第三种方案:不建议使用;降级版本不知道会出现其他的问题,风险较大,安全度不够高

浙公网安备 33010602011771号