MySQL 5.7.9版本sql_mode=only_full_group_by问题 用到GROUP BY 语句查询时com.MySQL.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘col_user_6.a.START_TIME’ which is not functionally dependent on columns in GROUP BY clause; 在MySQL 5.7.9版本中,引入了一个新的默认SQL模式`ONLY_FULL_GROUP_BY`,这个模式旨在增强SQL查询的严谨性,防止在GROUP BY语句中出现未聚合的列,以避免不确定的结果。然而,这也导致了某些在旧版本中能够正常运行的查询在新版本中出现错误。当使用GROUP BY语句时,如果你的SELECT列表中包含不在GROUP BY子句中的非聚合列,且这些列与GROUP BY子句中的列没有函数依赖关系,MySQL会抛出错误,如以下示例所示: ```sql com.MySQL.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘col_user_6.a.START_TIME’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by ``` 这个错误表明,你在SELECT语句中选择了`START_TIME`这一非聚合列,但它既不在GROUP BY子句中,也没有与GROUP BY子句中的任何列有函数依赖关系。在`ONLY_FULL_GROUP_BY`模式下,这是不允许的。 解决这个问题的方法主要有两个: 1. **修改SQL模式**: 你可以通过执行以下SQL语句临时或全局地禁用`ONLY_FULL_GROUP_BY`模式: ```sql -- 临时修改当前会话的SQL模式 SET SESSION sql_mode = ''; -- 或者全局修改SQL模式(需有管理员权限) SET GLOBAL sql_mode = ''; ``` 这将把SQL模式设置为空,从而允许那些在旧版本中可以运行但在新版本中被禁止的查询。 2. **正确编写GROUP BY查询**: 而不是禁用`ONLY_FULL_GROUP_BY`,更建议的做法是修正你的SQL查询,确保所有SELECT中的列要么是聚合函数的一部分,要么出现在GROUP BY子句中。例如,如果你希望根据`START_TIME`进行分组,那么你应该这样写: ```sql SELECT a.START_TIME, COUNT(*) FROM col_user_6 a GROUP BY a.START_TIME; ``` 在这个修正后的查询中,`START_TIME`列被包含在了GROUP BY子句中,而`COUNT(*)`是一个聚合函数。 了解SQL模式的概念非常重要,因为不同的SQL模式会影响数据库的行为。例如,`STRICT_TRANS_TABLES`模式要求在事务表中插入时数据必须完全有效,`NO_ZERO_IN_DATE`和`NO_ZERO_DATE`模式禁止日期字段包含零值,`ERROR_FOR_DIVISION_BY_ZERO`会在除以零时抛出错误,而非返回NULL,`NO_AUTO_CREATE_USER`阻止通过GRANT语句自动创建用户,`NO_ENGI`(可能是笔误)可能是想指`NO_ENGINE_SUBSTITUTION`,它会阻止MySQL在遇到未安装的存储引擎时自动替换为另一个引擎。 `ONLY_FULL_GROUP_BY`模式是MySQL为了符合SQL标准而引入的,虽然这可能导致一些兼容性问题,但其目的是提高查询的规范性和一致性。因此,理解并适应这种变化对于编写健壮的SQL代码至关重要。如果你的代码需要在多种SQL模式下工作,最好确保它们在`ONLY_FULL_GROUP_BY`模式下也能正常运行。 了解如何设置和调整SQL模式是每个数据库管理员和开发者的必备技能。你可以通过`SELECT @@GLOBAL.sql_mode`或`SELECT @@sql_mode`来查看当前的SQL模式设置,并根据需要进行调整。同时,确保在生产环境中谨慎操作,避免对现有应用程序造成影响。通过阅读MySQL文档和相关的技术文章,如“Mysql之SQL Mode用法详解”、“MySQL5.7中的sql_mode默认值带来的坑及解决方法”等,可以深入理解各种SQL模式的作用和应用场景,从而更好地优化和维护你的数据库系统。
- 粉丝: 6
- 资源: 956
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip