MySQL出现this is incompatible with sql_mode=only_full_group_by错误的解决办法

当使用MySQL的时候,我们可能会遇到以下错误提示:

Expression #N of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

造成这个错误的原因是MySQL默认开启了严格模式(strict mode),只有满足特定条件的GROUP BY查询才会通过,否则会抛出此错误。这在一些旧版本的MySQL中不会出现,但在较新的版本中却经常会出现。为了解决这个问题,我们需要进行如下操作。

解决办法

  1. 修改MySQL的配置文件

可以编辑MySQL配置文件,将sql_mode的值修改为其他值。比如我们可以将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的严格模式就被关闭了。要注意的是,这种方式需要登录MySQL的管理员账户,需要操作系统或服务器的管理员权限,如果使用的是共享主机,则可能无法进行这种修改。

  1. 使用GROUP BY时明确指定聚合函数

在进行GROUP BY查询时,我们需要确保SELECT列表中的所有列都是被聚合函数包裹的,或者都被列在GROUP BY之中。否则,可以手动指定聚合函数或者将列列在GROUP BY之中。比如以下查询是错误的:

SELECT column1, column2 FROM table1 GROUP BY column1;

正确的做法是:

SELECT column1, MAX(column2) FROM table1 GROUP BY column1;

或者:

SELECT column1, column2 FROM table1 GROUP BY column1, column2;

示例说明

示例1

使用GROUP BY时未聚合的字段未被列在GROUP BY之中,导致了该错误。假设我们有以下的查询语句:

SELECT department, AVG(salary) FROM employees GROUP BY department;

这一查询语句会计算每个部门(department)的平均工资(salary)。但是这个语句存在问题:我们在SELECT中选择了department和AVG(salary)这两列,其中salary并没有被聚合函数包裹。这个语句在严格模式下会失败,并且抛出上述的错误。

我们可以修改这个语句,让salary被包裹在AVG函数之中,或者将salary列在GROUP BY之中:

SELECT department, AVG(salary) FROM employees GROUP BY department, salary;

示例2

严格模式下的MySQL不允许在INSERT或UPDATE语句中插入空字符串(''),这时会抛出错误:Error: Data too long for column 'xxxxx' at row 1。我们需要将所有的空字符串都替换为NULL,以便解决这个问题。比如:

UPDATE table1 SET column1=NULL WHERE column1='';

这个语句会将表table1中的column1=''的记录全部更新为NULL。此时我们可以插入或更新NULL值了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL出现this is incompatible with sql_mode=only_full_group_by错误的解决办法 - Python技术站

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

相关文章

  • Shell、Perl、Python、PHP访问 MySQL 数据库代码实例

    Shell、Perl、Python、PHP都是常用的编程语言,通过它们,我们可以方便的访问和操作MySQL数据库。下面,我们将详细讲解在这些编程语言中如何访问MySQL数据库,以及提供一些代码实例。 一、Shell访问MySQL数据库 Shell是一种常见的面向文本的命令行界面,可以通过Shell脚本实现对MySQL数据库的访问和操作。 1. 安装MySQL…

    database 2023年5月22日
    00
  • MySQL8.0.28数据库安装和主从配置说明

    MySQL8.0.28 数据库安装和主从配置说明 本文将介绍如何在 Windows 操作系统下安装 MySQL 8.0.28 数据库,并进行主从配置。 安装 MySQL 下载 MySQL 安装程序 访问 MySQL 官网 https://dev.mysql.com/downloads/windows/installer/ 找到适合自己系统的版本,下载安装程序…

    database 2023年5月22日
    00
  • XAP和Virtuoso的区别

    XAP和Virtuoso都是用于数据管理的开源软件系统,二者的主要区别在于XAP是一个统一的实时数据网格系统,而Virtuoso则是一个通用的数据管理系统。 XAP是一种分布式云数据网格系统,它可以管理来自多个数据源的数据,并让多个应用程序可以透明地访问这些数据。XAP具有自适应、高可用性和高性能的特性,它可以扩展以支持大规模的数据和用户。XAP还包含了许多…

    database 2023年3月27日
    00
  • redis-cluster的实例动态调整内存

    当redis.conf中的最大内存配置为10G的时候,恰好程序已经写满了,但是物理主机是有内存的, 此时可以通过config set xxxx xxxx 来设置实例的内存大小,而不需要重启实例。   获取当前最大内存的大小: config get maxmemory   修改内存大小: config set maxmemory 32212254720   有…

    Redis 2023年4月11日
    00
  • Redis哨兵(sentinel)

    目录 前言 原理 架构图 下载 命令 配置 启动 查看 Sentinel(哨兵)配置 常用命令 Q&A Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused (DENIED Redis is running in protected mode) 前言 背景:测试环境的…

    Redis 2023年4月13日
    00
  • MYSQL ON UPDATE CURRENT_TIMESTAMP当字段值发生改变时才会更新记录的时间

    MYSQL ON UPDATE CURRENT_TIMESTAMP是MYSQL数据库中一种用于检测数据行发生改变的方式,如果数据行发生改变,它会自动更新记录的时间戳字段。下面将详细讲解MYSQL ON UPDATE CURRENT_TIMESTAMP的使用方法及其示例说明。 一、什么是MYSQL ON UPDATE CURRENT_TIMESTAMP? MY…

    database 2023年5月22日
    00
  • 如何在Python中查询MongoDB数据库中的数据?

    以下是在Python中查询MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已经了MongoDB数据库,并已经创建使用数据库和集合,同时需要安Python的驱动程序,例如pymongo。 步骤1:导模 在Python中使用pymongo模块连接MongoDB数据库。以下是导入…

    python 2023年5月12日
    00
  • MySQL慢查询相关参数原理解析

    MySQL慢查询相关参数原理解析 慢查询是什么? 慢查询是指MySQL中执行时间较长的SQL语句。通常情况下,执行时间大于指定时间就会被认为是慢查询。MySQL提供了一些参数来控制慢查询的行为。 慢查询相关参数 slow_query_log 这个参数用于启用或禁用慢查询日志。可以将其设置为0或1。设置为1表示启用慢查询日志,这将会对MySQL的性能有一定的影…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部