这是由于mysql启用了only_full_group_by模式导致的。以下是禁用该模式的三种方法,结合你的需求选择最合适的方案:
一、临时禁用(重启后失效)
1.当前会话禁用
直接在sql客户端执行以下命令,仅对当前数据库连接有效:
set session sql_mode = (select replace(@@sql_mode, 'only_full_group_by', ''));
2.全局禁用
修改全局设置,对所有新连接生效(但重启mysql服务后失效):
set global sql_mode = (select replace(@@global.sql_mode, 'only_full_group_by', ''));
二、永久禁用(需修改配置文件)
步骤:
找到mysql配置文件:
- windows:
my.ini(通常位于mysql安装目录或c:\programdata\mysql\mysql server 8.0)。 - linux:
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf。
- windows:
修改配置: 在
[mysqld]部分添加或修改sql_mode,移除only_full_group_by。 示例配置:[mysqld] sql_mode = strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution
重启mysql服务:
- windows:通过服务管理器重启mysql服务。
- linux:执行
sudo systemctl restart mysql。
验证:
select @@global.sql_mode;
确认输出中不再包含
only_full_group_by。
三、查询优化(推荐)
如果不想修改数据库配置,可以通过以下方式调整sql语句,使其符合only_full_group_by规则:
1.确保所有非聚合列在group by中
修改你的sql,将select列表中的非聚合列(如network_type)添加到group by子句:
group by t.id, cdn.cdn_device_network.network_type
2.使用聚合函数包裹非聚合列
对不需要分组的列使用any_value()函数:
select any_value(network_type) as network_type, ... from ... group by t.id
四、注意事项
- 数据一致性风险:禁用only_full_group_by可能导致查询结果不确定,建议生产环境谨慎操作。
- 配置文件优先级:确保修改的配置文件是mysql实际加载的(可能存在多个配置文件,优先级以最后加载的为准) 。
- mysql版本差异:mysql 8.0默认启用此模式,需通过配置文件永久修改 。
总结
- 快速修复:临时禁用(方法一)适合紧急调试。
- 长期方案:修改配置文件(方法二)确保重启后生效。
- 最佳实践:优化sql查询(方法三),避免依赖数据库模式
到此这篇关于mysql禁用only_full_group_by模式的三种方法的文章就介绍到这了,更多相关mysql禁用only_full_group_by内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论