MySQL错误-this is incompatible with sql_mode=only_full_group_by
封面图
•
2025-12-07
•
MySQL
258
0
0
0
这个错误信息: ``` ERROR 157 (42000): This is incompatible with sql_mode=only_full_group_by ``` 通常出现在你使用了 `GROUP BY` 子句,但没有正确地在 `SELECT` 中包含所有非聚合字段,或者某些字段没有被聚合函数(如 `MAX`, `MIN`, `SUM`, `COUNT`, `AVG` 等)处理。 --- ### 🔍 错误原因 MySQL 的 `sql_mode=only_full_group_by` 设置要求: > **当使用 `GROUP BY` 时,`SELECT` 列表中的每个列都必须是聚合函数的结果,或者是 `GROUP BY` 子句中列出的列。** 也就是说,如果你这样写: ```sql SELECT name, age FROM users GROUP BY name; ``` 那么 `age` 没有被聚合,也没有出现在 `GROUP BY` 中,就会报错。 --- ### ✅ 正确的写法(示例) #### 1. 包含所有非聚合字段在 `GROUP BY` 中: ```sql SELECT name, age FROM users GROUP BY name, age; ``` #### 2. 使用聚合函数: ```sql SELECT name, MAX(age) AS max_age FROM users GROUP BY name; ``` --- ### 🛠 解决方法 #### 方法一:修改 SQL 查询语句 确保所有 `SELECT` 中的字段要么是 `GROUP BY` 中的字段,要么是聚合函数。 #### 方法二:更改 MySQL 的 `sql_mode` 如果你不想修改查询语句,可以临时或永久禁用 `only_full_group_by` 模式。 ##### 临时修改(当前会话): ```sql SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; ``` ##### 永久修改(编辑 MySQL 配置文件): 打开 MySQL 配置文件(通常是 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`),找到或添加以下内容: ```ini [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" ``` 然后重启 MySQL 服务: ```bash sudo systemctl restart mysql ``` --- ### 🧠 小贴士 - `only_full_group_by` 是为了防止数据不一致的问题,建议在开发阶段开启,生产环境也推荐保留。 - 如果你确实需要“宽松”的 `GROUP BY` 行为,可以考虑使用子查询或窗口函数来替代。 --- ### 示例场景 **错误 SQL:** ```sql SELECT user_id, username, COUNT(*) FROM orders GROUP BY user_id; ``` **错误原因:** `username` 没有被聚合,也没有出现在 `GROUP BY` 中。 **修正 SQL:** ```sql SELECT user_id, username, COUNT(*) FROM orders GROUP BY user_id, username; ``` 或: ```sql SELECT user_id, MAX(username) AS username, COUNT(*) FROM orders GROUP BY user_id; ``` --- 如果你能提供具体的 SQL 语句,我可以帮你更准确地分析和修复问题。
上一篇:
MySQL修改密码的3种方式
下一篇:
mysqldump报错 Couldn't execute SHOW VARIABLES LIKE gtid_mode: Table
标题录入,一次不能超过6条
留言
评论