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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 操作系统实验ucore lab3
- DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题 下面我将对程序进行详
- final_work_job1(1).sql
- 区块链与联邦学习结合:FedChain项目详细复现指南
- 西门子S7 和 S7 Plus 协议开发示例
- 模块化多电平变流器 MMC 的VSG控制 同步发电机控制 MATLAB–Simulink仿真模型 5电平三相MMC,采用VSG控制 受端接可编辑三相交流源,直流侧接无穷大电源提供调频能量 设置频率
- 微电网(两台)主从控制孤岛-并网平滑切的分析 分析了: 1.孤岛下VF控制 2.并网下PQ控制 3.孤岛下主从控制 4.孤岛到并网的平滑切控制 5.除模型外还对分布式发电与主动配电网一些常见问题做了
- 第四组二手产品.zip
- 基于小程序的智慧物业平台源代码(java+小程序+mysql+LW).zip
- MVIMG_20241222_194113.jpg