一文详解MySQL设置only_full_group_by报错问题
在MySQL5.7及以上版本中,默认开启了only_full_group_by模式,这会导致在进行group by聚合操作时,如果select中的某些列没有在group by从句中出现,就会报错。出现这种情况的原因是因为该模式要求严格按照SQL标准进行操作,以保证数据的准确性和完整性。
为解决ONLY_FULL_GROUP_BY报错问题,可以通过以下方法:
1. 查看sql_mode设置
在MySQL中,可以使用如下命令查看当前的sql_mode设置:
SELECT @@sql_mode;
该命令输出的结果中,如果包含有ONLY_FULL_GROUP_BY,就说明该模式已经开启了。而对于开发环境中的MySQL5.6版本,在执行group by聚合操作时,并不会开启该模式,因此在开发过程中并不会出现该问题。
2. 去掉ONLY_FULL_GROUP_BY模式
如果要解决ONLY_FULL_GROUP_BY报错问题,就需要去掉该模式。可以使用如下命令修改全局sql_mode:
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的配置文件中可能没有设置sql_mode字段,可以手动添加:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
需要将该字段加入到[mysqld]配置内,并重启MySQL服务器,才能生效。
3. 修改MySQL配置文件
如果以上方法没有生效,可以尝试修改MySQL的配置文件。在Linux系统上,可以在/etc/my.cnf中查找sql_mode字段,如果不存在,可以手动添加:
[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服务器才能使修改生效。
总结:
ONLY_FULL_GROUP_BY模式的开启是为了确保数据在group by聚合操作时的准确性和完整性。然而,对于一些旧版本的MySQL数据库,以及一些开发过程中的sql语句,可能会因为该模式的存在而报错。为解决该问题,可以通过修改sql_mode设置以及MySQL的配置文件等方法来去掉ONLY_FULL_GROUP_BY模式。

-
MySQL Workbench怎么建立数据库(附:sql语句创建数据库方法) 2023-07-20 12:22:29
-
MySQL Workbench是什么?(附:如何设置中文教程) 2023-07-20 11:42:31
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
mysql怎么替换部分字符串 2023-05-14 07:00:02