MySQL错误提示:sql_mode=only_full_group_by完美解决方案

MySQL错误提示:sql_mode=only_full_group_by 是在 MySQL 5.7 版本中引入的一个新特性。当开启该模式时,如果使用了GROUP BY语句但是SELECT语句中的列名没有在GROUP BY中出现,或者在SELECT语句中使用了聚合函数,但是列名并不在GROUP BY语句中,则会抛出“1055 error - 'XXXX' isn't in GROUP BY”的错误提示。这也导致了很多老版本MySQL数据库运行原有的SQL脚本时报错的问题。

下面介绍 “MySQL错误提示:sql_mode=only_full_group_by”的完美解决方案:

一、查看当前的sql_mode设置

首先,我们需要查看当前MySQL数据库的SQL_MODE设置。在MySQL客户端中输入以下命令:

SELECT @@SESSION.sql_mode;

会返回如下的sql_mode:

ONLY_FULL_GROUP_BY,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设置,其中包含了 “ONLY_FULL_GROUP_BY” 模式。

二、修改MySQL配置文件

在MySQL的配置文件中修改sql_mode即可解决该问题。

首先,编辑MySQL的配置文件my.cnf或my.ini(Windows中)。在Ubuntu服务器中可以使用以下命令查找my.cnf的位置:

sudo find / -name "my.cnf"

然后,找到配置文件中的 [mysqld] 模块下的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"

保存修改后的配置并重启MySQL服务,操作完毕。

例如,在CentOS服务器中,MySQL的配置文件为 /etc/my.cnf,则编辑该文件:

sudo vi /etc/my.cnf

将如下的代码:

[mysqld]
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

修改为:

[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服务:

sudo systemctl restart mysqld

三、示例说明

示例1:新项目开发问题

当开发一个新项目时,使用了groupby语句以及聚合函数,为了查询按照时间统计结果,我们先使用groupby按照时间分组但是并不需要对时间字段再做聚合操作,此时依据 sql_mode=only_full_group_by。会收到如下错误提示:

1055 error - 'Date' isn't in GROUP BY

解决方案如下:

  1. 通过执行 SELECT @@SESSION.sql_mode; 命令查看SQL模式。
  2. 在 MySQL 配置文件 my.cnfmy.ini 里(具体路径取决于你的环境和MySQL的安装位置)查找 sql_mode 的设置项,将这一项的值修改为 STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  3. 重启 MySQL 服务器,如 systemctl restart mysqld.service

示例2:老项目运行问题

有一个老项目的部分SQL语句不符合SQL Mode的要求,执行SQL语句会抛出 “1055 error - 'XXXX' isn't in GROUP BY”的错误提示,而且为了维护方便并不想修改SQL语句,可以采用更改MySQL配置文件的方法来解决问题。我们可以在MySQL配置文件中增加下面两行的 SQL_MODE,来适应老项目运行所需 SQL_MODE 的模式:

[mysqld]
sql_mode=only_full_group_by,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

"only_full_group_by" 加回 sql_mode 中;这样在 MySQL 安装服务之后就能自动设置 SQL_MODE 的值。这样,老项目的SQL语句就可以正常运行,而开发新项目时由于也将 only_full_group_by 加回来,就避免出现 sql_mode=only_full_group_by 的错误提示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL错误提示:sql_mode=only_full_group_by完美解决方案 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 解决大于5.7版本mysql的分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated

    这个报错是由于MySQL 5.7版本以后对于分组查询的规则进行了更改导致的。现在要求分组查询中选择的列必须要么出现在GROUP BY子句中,要么是聚合函数,否则会报错。如果数据表中存在要查询的字段中有出现在GROUP BY子句中的列之外的字段时,就会出现“Expression #1 of SELECT list is not in GROUP BY clau…

    MySQL 2023年5月18日
    00
  • mysql第一次安装成功后初始化密码操作步骤

    下面是关于如何初始化MySQL的操作步骤及示例说明: 步骤1:启动MySQL服务 在终端窗口中输入以下命令启动MySQL服务: sudo service mysql start 步骤2:停止MySQL服务 若MySQL已经运行,则可以使用以下命令停止MySQL服务: sudo service mysql stop 步骤3:使用安全设置脚本 安装MySQL时,…

    MySQL 2023年5月18日
    00
  • Java 程序员容易犯的10个SQL错误

    Java 程序员容易犯的10个SQL错误攻略 1. 没有使用参数化查询 使用参数化查询可以防止 SQL 注入攻击。SQL 注入攻击是指攻击者在数据库查询中注入恶意的 SQL 语句,从而获取非法的数据库权限或数据。因此,在编写 SQL 查询时应该使用参数化查询来避免此类攻击。 示例: String name = "John"; String…

    MySQL 2023年5月18日
    00
  • 在Linux上优化Mysql运行环境让你对Mysql更多了解

    优化Mysql的缓存 Mysql的查询性能直接受到缓存的影响,因此优化缓存是提高Mysql性能的重要因素。可以在Mysql的配置文件中设置缓存大小等参数,主要有以下几个参数: key_buffer_size = 256M sort_buffer_size = 16M read_buffer_size = 4M read_rnd_buffer_size = 8…

    MySQL 2023年5月19日
    00
  • linux下mysql表名大小写敏感的问题

    执行sql: show global variables like ‘%lower_case%’; lower_case_file_system:表示当前系统文件是否大小写敏感,只读参数,无法修改ON 大小写不敏感 OFF 大小写敏感   lower_case_table_names:这个选项不仅仅适用于表名的大小写敏感,同样适用于数据库名和表别名。该变量取…

    MySQL 2023年4月13日
    00
  • 浅谈MySQL之select优化方案

    让我为您详细讲解“浅谈MySQL之select优化方案”的完整攻略。 浅谈 MySQL 之 Select 优化方案 背景 在 MySQL 数据库中,SELECT 操作是使用最频繁的操作之一。但是,长时间的高并发查询操作会导致数据库的性能问题,严重影响业务的正常运行。所以,我们需要对 SELECT 操作的优化方案进行深入研究。 select 的优化方案 在 M…

    MySQL 2023年5月19日
    00
  • 向MySQL 中存储大文本数据

    package cn.itcast.demo; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.Reader; import java.sql.Connecti…

    MySQL 2023年4月13日
    00
  • MySQL子查询注意事项

    MySQL子查询是指在一个查询语句中嵌套另一个查询语句,通常是在WHERE子句中使用。下面详细介绍MySQL子查询的注意事项。 子查询要用小括号包含起来。 子查询可以嵌套多层。 子查询可以在SELECT、FROM、WHERE、HAVING等语句中使用。 子查询与主查询是相互独立的,即子查询能够单独执行。 子查询返回的结果只能是一行或一列,否则会报错。 子查询…

    MySQL 2023年3月9日
    00
合作推广
合作推广
分享本页
返回顶部