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 规则,修改成本较高,且需要测试介入全面测试,人力成本在这里;且存在潜在测不到的问题

第三种方案:不建议使用;降级版本不知道会出现其他的问题,风险较大,安全度不够高

posted @ 2025-08-13 12:34  寻码疹  阅读(13)  评论(0)    收藏  举报