MySQL-V5.6以后#ERROR1055 sql_mode=only_full_group_by

解决MySQL ONLY_FULL_GROUP_BY问题

在sql_mode=only_full_group_by模式下不能执行Insert,SQL Mode详见

1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 
'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause;
 this is incompatible with sql_mode=only_full_group_by

only_full_group_by的作用

MySQL在5.7版本以后,ONLY_FULL_GROUP_BY對GROUP BY合法性的檢查。当配置了此sql_mode后,select语句中要查询的字段必须严格是group by语句中的字段或者是聚合函数。

通过my.ini文件删除

MySQL的配置信息如下

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

通过命令行删除ONLY_FULL_GROUP_BY

mysql> select version(), @@sql_mode;

SELECT @@sql_mode;

+-----------+--------------------------------------------+
| version() | @@sql_mode                                 |
+-----------+--------------------------------------------+
| 5.6.49    | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+-----------+--------------------------------------------+
mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Query OK, 0 rows affected


SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

去掉Mysql 语法检查

SET sql_mode = ''
<think> 我们正在解决的是MySQL错误1055,它是由sql_mode=only_full_group_by引起的。 根据引用[5],该问题的基本解决思路是修改sql_mode,移除only_full_group_by模式。 但需要注意:直接移除only_full_group_by可能会降低SQL的严谨性,因此我们提供多种解决方案。 错误原因分析: 在MySQL 5.7及以上版本,默认启用了sql_modeONLY_FULL_GROUP_BY选项。该选项要求: -GROUP BY子句中必须包含所有非聚合列(除非该列在功能上依赖于GROUP BY列) - 否则,在SELECT、HAVING或ORDER BY子句中使用非聚合列且不在GROUP BY中的列将报错。 当前错误出现在ORDER BY子句中引用了非聚合列,且该列不在GROUP BY子句中,也不功能依赖于GROUP BY列。 解决方案: 方法1(临时修改):在当前会话中修改sql_mode(重启后失效) ```sql SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '')); ``` 方法2(永久修改):修改MySQL配置文件(需要重启MySQL服务) 1. 找到MySQL配置文件(my.cnf或my.ini) 2. 在[mysqld]下添加: sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 3. 重启MySQL 方法3(SQL改写):调整SQL语句使其符合ONLY_FULL_GROUP_BY规则 - 确保SELECT、HAVING、ORDER BY中的每个非聚合列都出现在GROUP BY子句中 - 或者,使用聚合函数(如ANY_VALUE())包裹非聚合列(MySQL 5.7.5+支持) 示例:原始错误SQL可能类似于(引用中涉及information_schema.PROFILING,但用户实际SQL不一定如此): ```sql SELECT ... GROUP BY column1 ORDER BY column2; -- 错误:column2不在GROUP BY中且非聚合 ``` 改写方式1:将column2加入GROUP BY ```sql SELECT ... GROUP BY column1, column2 ORDER BY column2; ``` 改写方式2:使用ANY_VALUE函数 ```sql SELECT ... GROUP BY column1 ORDER BY ANY_VALUE(column2); ``` 方法4:禁用ONLY_FULL_GROUP_BY(不推荐,但快速) ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 注意:方法4需要SUPER权限,且影响全局。 验证步骤: 1. 查看当前sql_mode: ```sql SELECT @@sql_mode; ``` 2. 执行原SQL语句,检查错误是否解决。 最佳实践建议: - 优先考虑改写SQL语句以符合ONLY_FULL_GROUP_BY规范,这样可保证SQL的严谨性和可移植性。 - 如果使用旧版应用无法修改SQL,再考虑修改sql_mode。 引用说明: 根据引用[2]和[5],该错误的直接原因是sql_mode包含only_full_group_by,并且提供了修改sql_mode的解决方案[^2][^5]。 操作流程图: ```mermaid graph TD A[遇到错误1055] --> B{是否允许修改SQL?} B ----> C[改写SQL:将非聚合列加入GROUP BY或用聚合函数包裹] B ----> D{是否允许修改配置?} D ----> E[临时修改sql_mode(会话级)] E --> F[问题解决] D ----> G[永久修改配置文件] G --> H[重启MySQL服务] H --> F ``` 注意事项: - 修改全局sql_mode会影响所有新会话,需谨慎。 - 在集群环境中,需确保所有节点配置一致。 相关问题: 1. 如何查看当前MySQLsql_mode设置? 2. 除了移除ONLY_FULL_GROUP_BY,还有其他方式解决错误1055吗? 3. 为什么MySQL 5.7默认启用ONLY_FULL_GROUP_BY? 4. 如何在不重启MySQL的情况下永久修改sql_mode?(注意:无法真正永久生效而不重启,除非同时修改配置文件和当前运行值,但重启后配置文件才永久生效) </think> ### 解决MySQL错误1055ONLY_FULL_GROUP_BY冲突 #### 🚫 错误原因分析 1. **严格模式限制**:MySQL 5.7+默认启用`sql_mode=only_full_group_by`,要求`SELECT/ORDER BY`中的非聚合列必须出现在`GROUP BY`子句中[^2][^5] 2. **非法列引用**:`ORDER BY`子句引用了`information_schema.PROFILING.SEQ`(非聚合列且不在`GROUP BY`中) 3. **版本兼容问题**:旧版SQL语句在新版MySQL运行时触发此错误(如从MySQL 5.6升级到5.7+) #### ✅ 四种解决方案 ##### 方法1:临时禁用严格模式(会话级) ```sql -- 仅影响当前会话 SET SESSION sql_mode = ( SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '') ); ``` - **适用场景**:快速测试/临时修复 - **效果**:立即生效,会话结束后失效[^5] ##### 方法2:永久修改配置文件(推荐生产环境) 1. 编辑MySQL配置文件: ```bash # Linux: /etc/my.cnf 或 /etc/mysql/my.cnf # Windows: my.ini [mysqld] sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION ``` 2. 重启MySQL服务: ```bash sudo systemctl restart mysql # Linux ``` - **效果**:全局生效,需重启服务[^5] ##### 方法3:改写SQL语句(标准方案) ```sql -- 原始错误语句(示例) SELECT department, name, salary FROM employees GROUP BY department ORDER BY salary; -- 错误:salary不在GROUP BY-- 修正方案1:将ORDER BY列加入GROUP BY SELECT department, name, salary FROM employees GROUP BY department, salary -- 添加salary到GROUP BY ORDER BY salary; -- 修正方案2:使用聚合函数(MySQL 5.7.5+) SELECT department, ANY_VALUE(name), MAX(salary) FROM employees GROUP BY department ORDER BY MAX(salary); -- 聚合列允许出现在ORDER BY ``` ##### 方法4:动态修改全局设置(需SUPER权限) ```sql SET GLOBAL sql_mode = ( SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '') ); ``` - **风险**:影响所有新会话,可能导致其他SQL兼容性问题 #### 🔍 验证与调试步骤 1. **查看当前sql_mode**: ```sql SELECT @@sql_mode; -- 典型返回值:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES... ``` 2. **检查表结构依赖**(针对`information_schema`错误): ```sql SHOW COLUMNS FROM information_schema.PROFILING; -- 确认SEQ列是否存在 ``` 3. **测试模式修改效果**: ```sql -- 修改后执行原SQL语句验证 SELECT @@sql_mode; -- 确认ONLY_FULL_GROUP_BY已移除 ``` #### ⚠️ 注意事项 1. **数据安全**:移除`ONLY_FULL_GROUP_BY`可能导致非确定查询(同一分组返回任意行)[^2] 2. **版本差异**: - MySQL 5.6:默认禁用此模式 - MySQL 5.7+:默认启用 3. **云数据库限制**:AWS RDS等云服务需通过参数组修改配置 #### 💡 最佳实践 ```mermaid graph LR A[遇到错误1055] --> B{是否重要生产环境?} B -->|是| C[修改SQL语句<br>遵循ONLY_FULL_GROUP_BY] B -->|否| D[临时禁用严格模式] C --> E[标准兼容方案] D --> F[快速修复方案] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值