Mysql问题only_full_group_by

本文介绍了解决MySQL5.7版本中因only_full_group_by设置导致的查询错误问题,提供了修改my.ini文件的具体步骤及配置示例。

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

mysql查询报错: ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by


在用mysql执行如下查询的时候:

select * from fruits GROUP BY s_id,f_name;
  • 1

报错信息如下:

[Err] 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
  • 1

错误的原因是我mysql版本是5.7的,使用如下语句查询可知

select @@sql_mode;
  • 1

里面默认设置了

sql_mode=only_full_group_by
  • 1

only_full_group_by :使用这个就是使用和oracle一样的group 规则, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其实这个配置目前个人感觉和distinct差不多的,所以去掉就好

在windows系统里面,直接修改my.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
  • 1

到此mysql配置文件的完整配置如下:



MySQL中,默认启用了 `ONLY_FULL_GROUP_BY` 模式,该模式强制要求在 `GROUP BY` 查询中,所有出现在 `SELECT` 列表中的非聚合列都必须包含在 `GROUP BY` 子句里。如果不满足这一条件,则会抛出错误。 如果你希望禁用此功能并允许更宽松的行为(例如选择不在 `GROUP BY` 中明确指定的所有字段),可以调整 SQL 模式的设置: ### 禁用 ONLY_FULL_GROUP_BY 的步骤 #### 步骤1:查看当前SQL模式 首先检查 MySQL 当前启用的 SQL 模式: ```sql SELECT @@GLOBAL.sql_mode global_sql_mode, @@SESSION.sql_mode session_sql_mode; ``` 这将返回全局和会话级别的 SQL 模式字符串列表,其中可能包括 `ONLY_FULL_GROUP_BY`。 #### 步骤2:临时关闭 SESSION 级别的限制 如果仅想对当前连接有效果,可以在会话级别移除 `ONLY_FULL_GROUP_BY` 设置: ```sql SET SESSION sql_mode = REPLACE(REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY,', ''), ',ONLY_FULL_GROUP_BY', ''); ``` #### 步骤3:永久修改配置文件 (适用于服务器级) 对于持久化更改,需要编辑 MySQL 配置文件 (`my.cnf` 或者 `my.ini`) 并添加或修改如下内容到 `[mysqld]` 下面部分: ``` [mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 注意这里未包含 ONLY_FULL_GROUP_BY 参数项。 ``` 然后重启数据库服务让改动生效。 --- #### 示例说明 假设我们有如下的查询语句,在开启了 `ONLY_FULL_GROUP_BY` 后可能会报错: ```sql SELECT order_id, customer_name, SUM(amount) FROM orders GROUP BY order_id; ``` 因为 `customer_name` 这一列既不是分组依据也不是聚集函数的结果,所以违反了规则。 通过上述方法取消限制之后,上面这条语句就可以正常运行了,并且每个订单对应的客户名称取值取决于具体实现细节(通常是任意一行数据)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值