mysql解决only_full_group_by

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

查询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 8.0 中 only_full_group_by 的设置方法及影响 在 MySQL 8.0 及以上版本中,`only_full_group_by` 是 SQL 模式的一部分,用于强制执行更严格的 `GROUP BY` 规则。这种模式确保查询中的非聚合列必须出现在 `GROUP BY` 子句中[^1]。如果未满足此条件,MySQL 将抛出错误。 #### 设置方法 以下是几种常见的设置 `only_full_group_by` 的方法: 1. **修改配置文件 `my.cnf` 或 `my.ini`** 在 MySQL 配置文件中添加或修改 `sql_mode` 参数,移除 `ONLY_FULL_GROUP_BY` 模式: ```ini [mysqld] sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' ``` 修改完成后需要重启 MySQL 服务以使更改生效[^1]。 2. **临时修改 SQL 模式** 如果不想永久更改配置文件,可以通过会话级别的命令临时禁用 `ONLY_FULL_GROUP_BY`: ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 这种方法仅对当前会话有效,或者直到 MySQL 服务重启为止[^2]。 3. **使用图形化工具(如 Navicat)修改** 通过 Navicat 等图形化工具连接到 MySQL 数据库后,可以执行上述 SQL 命令来动态调整 SQL 模式[^2]。 #### 影响分析 启用 `only_full_group_by` 后,MySQL 对 `GROUP BY` 查询的处理更加严格。具体影响如下: 1. **查询限制** - 在启用了 `only_full_group_by` 的情况下,任何不在 `GROUP BY` 子句中列出的非聚合列都将被禁止出现在 `SELECT` 列表中[^3]。 - 例如,以下查询将失败: ```sql SELECT customer_id, order_date, COUNT(*) FROM orders GROUP BY customer_id; ``` 错误信息为:`Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'orders.order_date' which is not functionally dependent on columns in GROUP BY clause`. 2. **数据一致性** - 启用 `only_full_group_by` 提高了数据查询的一致性,避免了潜在的歧义和错误结果。 - 例如,当 `order_date` 不唯一时,MySQL 不再随意选择一个值作为结果,而是强制用户明确指定如何处理这些值。 3. **性能优化** - 更严格的规则可能促使开发者编写更清晰、更高效的查询语句,从而间接提升数据库性能。 4. **兼容性问题** - 某些旧版应用程序可能依赖于较宽松的 `GROUP BY` 行为。在这种情况下,禁用 `only_full_group_by` 可能是权宜之计,但长期来看,建议重构相关查询以符合新标准[^1]。 ```sql -- 示例:正确使用 GROUP BY SELECT customer_id, MAX(order_date), COUNT(*) FROM orders GROUP BY customer_id; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值