mysql解决only_full_group_by

本文介绍如何查询及修改MySQL的sql_mode配置。通过SQL语句可以查看当前配置,并提供临时及永久修改的方法。对于希望调整数据库行为的用户来说非常有用。

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

查询mysql配置:

select @@global.sql_mode;

这两个是多余的,也可以试试:


set @@sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

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

输入mysql配置:执行如下语句,只能临时解决,mysql重启又恢复配置,在操作一次,哈哈

set global 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中,默认启用了 `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、付费专栏及课程。

余额充值