解决mysql问题: this is incompatible with sql_mode=only_full_group_by

今天在部署一趟测试环境的服务,各种配置文件都配好了,启动服务后台报错,解决后记录一下,小伙伴们也可以看看!

### Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'storage.storage_category.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'storage.storage_category.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by] <----
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'storage.storage_category.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
### The error may exist in URL [jar:file:/home/storage/storage_starter-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/mapper/StorageCategoryMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select         id, first_category, code, second_category, creator, updator, create_time, update_time, is_deleted         from storage.storage_category          WHERE  first_category = ?                          and is_deleted = 0                        group by second_category                             order by id

在网上也查了一些信息:

这个错误信息是由MySQL数据库返回的,它指出SQL查询中违反了ONLY_FULL_GROUP_BY SQL模式的要求。当MySQL启用了ONLY_FULL_GROUP_BY模式时,任何SELECT列表、HAVING条件或ORDER BY列表中的非聚合列都必须出现在GROUP BY子句中。如果它们不在GROUP BY子句中,且不是通过聚合函数(如SUM(), COUNT(), MAX(), MIN(), AVG()等)处理的,就会抛出这个错误。

错误信息中提到的storage.storage_category.id这一列没有被包含在GROUP BY子句中,同时也没有被聚合函数处理,因此违反了ONLY_FULL_GROUP_BY规则。

要解决这个问题,可以采取以下几种方法之一:

       1. 修改SQL查询:确保SELECT列表中的所有非聚合列都包含在GROUP BY子句中。例如,如果你的查询类似于这样:

SELECT storage_category.id, COUNT(*)  
FROM your_table  
GROUP BY some_other_column;

需要将storage_category.id也加入到GROUP BY子句中:

SELECT storage_category.id, COUNT(*)  
FROM your_table  
GROUP BY storage_category.id, some_other_column;

2. 关闭ONLY_FULL_GROUP_BY模式:如果你确定你的查询逻辑是正确的,并且不需要完全符合ONLY_FULL_GROUP_BY的要求,你可以关闭这个SQL模式。关闭该模式的方法是在MySQL配置文件中设置或者在运行时执行以下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',''));

3.使用聚合函数:如果storage.storage_category.id列不需要单独列出每个唯一的值,而是可以通过聚合函数来汇总,比如取最小值或最大值,你可以修改查询来使用这些聚合函数。

SELECT MIN(storage_category.id) AS min_id, COUNT(*)  
FROM your_table  
GROUP BY some_other_column;

我在线上环境正常部署一切正常,所以我采用了第二种方式 关闭ONLY_FULL_GROUP_BY模式。

下面看看如何关闭ONLY_FULL_GROUP_BY模式?

  1. 找到MySQL的配置文件。在Linux系统中,配置文件通常位于/etc/mysql/my.cnf/etc/my.cnf。如果是其他操作系统,如Windows,配置文件的位置可能会有所不同。
  2. 使用文本编辑器打开配置文件。
  3. 在配置文件中找到[mysqld]部分。
  4. [mysqld]部分下添加或修改以下行,将sql_mode的值设置为不包含ONLY_FULL_GROUP_BY的模式。例如,可以设置为空字符串(禁用所有SQL模式)或指定其他你需要的SQL模式,但确保不包括ONLY_FULL_GROUP_BY

[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"

请注意,配置文件中可能已经存在其他的sql_mode值,你需要将ONLY_FULL_GROUP_BY选项从其中移除,而不是简单地添加一个新的sql_mode行。

  1. 保存并关闭配置文件。
  2. 重启MySQL服务,使配置文件生效。在Linux系统中,可以使用以下命令重启MySQL服务:

sudo systemctl restart mysql 

请注意,关闭ONLY_FULL_GROUP_BY模式可能会导致一些查询结果不准确,因为在没有该模式的情况下,MySQL允许非聚合列出现在SELECT列表或HAVING条件中,即使它们没有包含在GROUP BY子句中。因此,在关闭该模式之前,请确保你了解可能的影响,并仔细考虑是否真的需要关闭它。如果只是为了临时解决某个查询问题,你也可以考虑使用SET命令在运行时临时禁用ONLY_FULL_GROUP_BY选项,而不是修改配置文件。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/562971.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软Microsoft Surface Go 2

1个小玩具 Microsoft Surface Go 2的评测结果出炉&#xff01;它是目前最好的中端Windows 二合一笔记本平板。 外形简洁小巧&#xff0c;工作娱乐两不误。 它有多个版本。 我们测试的是配备8GB Ram和128GB SSD的Pentium 4425Y处理器&#xff08;第8代&#xff09;的型号。 S…

牛客小白月赛89补题1(ABCD)(偏难)

评价&#xff1a; 高情商&#xff1a;收获很大 &#xff0c;让自己进一步认清自己。 低情商&#xff1a;题目难&#xff0c;自己太菜了。 今天还有一些其他事&#xff0c;剩下的题明天再补。 我们从a题开始吧&#xff1a; A.签到 我们只要看看其中的max与min是否不符合即可…

QT文件读写操作和内容提取

访问IO设备&#xff0c;需要先调用open()来设置正确的OpenMode(例如ReadOnly或ReadWrite) 打开设备后后&#xff0c;使用write() 或putChar() 写入数据到文件和设备&#xff0c;并通过调用read()&#xff0c;readLine() 或readAll() 进行读取&#xff1b;使用完设备后&#xf…

Linux之文件系统与软硬链接

前言 我们之前阐述的内容都是在文件打开的前提下, 但是事实上不是所有文件都是被打开的, 且大部分文件都不是被打开的(也就是文件当前并不需要被访问), 都在磁盘中进行保存. 那这些没有被(进程)打开的文件, 也是需要被管理的! 对于这部分文件核心工作之一是能够快速定位文件…

【prompt六】MaPLe: Multi-modal Prompt Learning

1.motivation 最近的CLIP适应方法学习提示作为文本输入,以微调下游任务的CLIP。使用提示来适应CLIP(语言或视觉)的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。在这项工作中,我们提出了针对视觉和语言分支的多模态提示学习(MaPLe),以…

Flutter开发进阶之瞧瞧BuildOwner

Flutter开发进阶之瞧瞧BuildOwner 上回说到关于Element Tree的构建还缺最后一块拼图&#xff0c;build的重要过程中会调用_element!.markNeedsBuild();&#xff0c;而markNeedsBuild会调用owner!.scheduleBuildFor(this);。 在Flutter框架中&#xff0c;BuildOwner负责管理构建…

网络层(IP层)

IP协议的本质&#xff1a;有将数据跨网络传输的能力 而用户需要的是将数据从主机A到主机B可靠地跨网络传输 IP的组成&#xff1a;目标网络目标主机 IP由目标网络和目标主机两部分组成&#xff0c;IP报文要进行传输&#xff0c;要先到达目标网络&#xff0c;然后经过路由器转到…

综合知识篇20-基于中间件的开发新技术考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

div3 E. Binary Search

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 2e5 5, inf 1e18, maxm 4e4 5, base 397; const i…

一个单生产-多消费模式下无锁方案(ygluu/卢益贵)

一个单生产-多消费模式下无锁方案 ygluu/卢益贵 关键词&#xff1a;生产者-消费者模型、无锁队列、golang、RWMutex 本文介绍一个“单生产(低频)-多消费”模式下的无锁哈希类方案&#xff0c;这个方案的性能优于golang的RWMutex&#xff0c;因为它永远不会因为“写”而导致与…

【Flask】Flask数据迁移操作

Flask数据迁移操作 前提条件 安装第三方包&#xff1a; # ORM pip install flask-sqlalchemy # 数据迁移 pip install flask-migrate # MySQL驱动 pip install pymysql # 安装失败&#xff0c;指定如下镜像源即可 # pip install flask-sqlalchemy https://pypi.tuna.tsinghu…

JVM——运行时数据区

前言 由于JAVA程序是交由JVM执行的&#xff0c;所以我们所说的JAVA内存区域划分也是指的JVM内存区域划分&#xff0c;JAVA程序具体执行的过程如下图所示。首先Java源代码文件会被Java编译器编译为字节码文件&#xff0c;然后由JVM中的类加载器加载各个类的字节码文件&#xff0…