mysql5.7报err 1055错误 sql_mode=only_full_group_by

本文介绍如何在MySQL中配置严格的SQL模式,通过修改my.cnf文件并在末尾添加特定的sql_mode设置,确保数据库操作遵循更严格的标准,提高数据完整性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vim /etc/my.cnf 

末尾增加

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

 

systemctl restart mysqld

<think>好的,我现在要解决用户提出的MySQL错误1055的问题。首先,我需要理解这个错误的具体内容。错误信息提到SELECT列表中的第二个表达式不在GROUP BY子句中,并且包含非聚合列&#39;test_mysql.d.department_person_num&#39;,而该列在功能上不依赖于GROUP BY的列,这与sql_mode设置为only_full_group_by不兼容。 接下来,我需要回忆一下MySQLsql_mode的作用。sql_mode设置决定了MySQLSQL语法和数据处理方式。only_full_group_by是其中一种模式,启用后要求GROUP BY子句必须包含所有非聚合列,除非这些列在功能上依赖于GROUP BY的列。这样可以避免查询结果的不确定性,确保数据正确性。 用户的问题在于查询中的某个列没有包含在GROUP BY中,也没有被聚合函数处理,导致MySQL拒绝执行。这通常发生在升级到MySQL 5.7或更高版本后,因为默认启用了only_full_group_by模式。 接下来,我需要思考解决方案。可能的解决方法有三种: 第一种是修改查询,确保所有SELECT中的非聚合列都包含在GROUP BY子句中,或者使用聚合函数如MAX()、MIN()等处理这些列。这种方法符合SQL标准,推荐使用,因为它保证了查询的规范性和结果的准确性。 第二种是调整sql_mode设置,移除only_full_group_by。但这种方法可能会影响其他查询的严格性,导致潜在的数据不一致问题,需要谨慎操作。用户可以通过SET命令临时修改会话级别的设置,或者修改配置文件永久生效,但需注意生产环境的风险。 第三种是检查表结构,如果非聚合列确实功能依赖于GROUP BY列,可以添加适当的索引或调整表设计,使MySQL能够识别这种依赖关系。例如,如果department_person_num在功能上由department_id唯一确定,那么确保department_id是主键或唯一索引,这样MySQL可能会自动识别依赖关系,允许查询执行。 接下来需要考虑用户可能的实际情况。例如,用户可能在编写查询时遗漏了GROUP BY的列,或者表设计存在问题。需要建议用户检查查询逻辑,确认是否需要添加更多的列到GROUP BY,或者是否应使用聚合函数。 另外,需要提醒用户,禁用only_full_group_by可能掩盖潜在的问题,导致不可预测的结果,尤其是在处理复杂查询时。因此,优先推荐修正查询语句而不是修改SQL模式。 最后,总结解决方案,分步骤说明,帮助用户逐步排查和解决问题。同时,给出具体的示例,帮助用户理解如何修改查询或调整配置。需要确保回答结构清晰,语言简洁,便于用户理解和操作。</think>### MySQL错误1055的逐步解释与解决方案 --- #### **错误原因分析** 此错误MySQL的**sql_mode=only_full_group_by**模式触发。该模式要求: 1. **SELECT子句**中的**所有非聚合列**必须出现在**GROUP BY子句**中; 2. 或这些列在功能上完全依赖于GROUP BY的列(例如主键或唯一索引)。 若违反上述规则,MySQL会拒绝执行查询,防止返回不确定的结果。 --- #### **复现问题的示例** 假设表结构如下: ```sql CREATE TABLE department ( department_id INT PRIMARY KEY, department_name VARCHAR(50), department_person_num INT ); ``` 执行以下查询会触发错误: ```sql SELECT department_id, department_person_num FROM department GROUP BY department_id; ``` 错误原因:`department_person_num`未包含在GROUP BY中,且未使用聚合函数。 --- #### **解决方案** ##### **方法1:修正查询语句(推荐)** - **将非聚合列添加到GROUP BY**: ```sql SELECT department_id, department_person_num FROM department GROUP BY department_id, department_person_num; -- 添加缺失的列 ``` - **或使用聚合函数**: ```sql SELECT department_id, MAX(department_person_num) -- 使用MAX、MIN等聚合函数 FROM department GROUP BY department_id; ``` ##### **方法2:调整sql_mode(谨慎使用)** - **临时关闭only_full_group_by(仅当前会话生效)**: ```sql SET SESSION sql_mode = &#39;STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION&#39;; ``` - **永久关闭(需修改配置文件)**: 1. 编辑MySQL配置文件(如`my.cnf`或`my.ini`); 2. 在`[mysqld]`段添加: ```ini sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION ``` 3. 重启MySQL服务。 ##### **方法3:优化表设计(高级)** 若`department_person_num`的值完全由`department_id`决定(例如`department_id`是主键): - 确保`department_id`是主键或唯一索引: ```sql ALTER TABLE department ADD PRIMARY KEY (department_id); -- 如果未设置主键 ``` - MySQL会自动识别功能依赖,此时查询可正常执行。 --- #### **为何推荐优先修正查询?** - **数据一致性**:禁用`only_full_group_by`可能导致同一查询在不同MySQL版本中返回不同结果。 - **SQL标准兼容性**:遵循GROUP BY规范可提升代码可移植性(如迁移到其他数据库)。 --- #### **总结步骤** 1. **检查查询**:确认所有SELECT中的非聚合列已包含在GROUP BY或使用聚合函数; 2. **验证表结构**:检查是否可通过主键/唯一索引建立功能依赖; 3. **谨慎修改sql_mode**:仅在必要时调整,并评估潜在风险。 通过上述步骤,可有效解决错误1055并确保查询符合MySQL的严格模式要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值