SQL报错this is incompatible with sql_mode=only_full_group_by

news2024/12/24 11:31:12

一、bug记录

1.1.bug截图 

1.2.sql语句 

SELECT id,batch_no,if_code,channel_mch_no,bill_date,bill_type,currency,order_id,
channel_order_no,channel_amount,channel_fee_amount,channel_success_at,
channel_user,channel_state,org_pay_order_id,channel_refund_amount,created_at,
updated_at 
FROM t_check_channel_bill 
WHERE batch_no = 'zjpay_M1638950514_20230410' AND order_id IS NOT NULL 
GROUP BY order_id 
HAVING MAX(channel_success_at)

1.3.完整错误 

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

二、情景复现 

 三、bug处理

        在上面,我在其他数据库,仿照着写出来的SQL语句,并没有出现示例错误,在这种情况下,可以先分析错误原因:

        1)sql语句错误

        2)数据错误

        3)库的问题

3.1.sql错误分析和数据错误

        原错误:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xyzpay.t_check_channel_bill.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

翻译过来就是select选择出来的列不在group by后面也不依赖于group by列的功能。这与sql_mode=only_full_group_by不兼容。是因为出现了错误查询。如果语句中有group by子句,那么select后面就必须是group by后面的属性或者是 某聚集函数(group by后面没有的属性)【例如avg(),max(),min()…】

        但很明显,可以看到,我的 order_id 是包含在查询语句中的,所以这个错误描述很明显是不准确的。

        无论将SQL如何调整,这个错误始终跟随。并且错误的最后一句话:这与sqlmode=onlyfull_groupby不兼容, 那我们就去查一下sqlmode

3.2.库错误分析 

        首先使用出错误的库进行查询

sql语句:
    
    select @@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

        然后查询“错误复现”失败的库

sql语句:
    
    select @@sql_mode

查询结果:

    STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

         可以看出这查出结果并不一样,那可以修改一下库,看看能不能复现这个错误。

        值得一提的是:修改数据库本身,并不能使用update语句,直接使用 set 即可。

        set修改数据库: 

SET @@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'

修改结果        

         重新模拟错误,可以看到错误被复现了,说明找的地方正确

         然后就发现,原本能正常运行的sql,现在出现了问题。那么可以确定,这个SQL错误是数据库的原因。既然是数据库的问题,那反过来修改数据库,把这个字段修改掉,那就没问题了。

SET @@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重启后就会失效。但我使用的是公司数据库,所以数据库基本不会重启, 就没这个问题了。但如果是自己本地做测试,那么重启后就会失效。

3.3.持久化修改

        

修改my.ini(Windows中MySQL配置文件)
在里面添加

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION1'


        (目的是将ONLY_FULL_GROUP_BY关闭,为了便于展示,我将语句用回车分作两行了,实际添加中,无需如此。)
        在修改过程中,注意使用英文单引号  ‘’  将数据包起来,不能使用中文。然后将文件保存为ANSI编码格式。

        注:my.ini 是静态文件,与服务是否在运行没什么关系。所以说可以不必先 stop 服务再修改 my.ini。

四、拓展

        下面是官方MySQL 5.7参考手册中关于ONLY_FULL_GROUP_BY的解释。SQL使用文档

  

        翻译下就是:

        拒绝select列表、HAVING条件或ORDER BY列表引用非聚合列的查询,这些列既不在GROUP BY子句中命名,也不依赖于GROUP BY列的功能(由GROUP BY列唯一确定)。
        从MySQL5.7.5开始,默认的SQL模式包括ONLY_FULL_GROUP_BY。(在5.7.5之前,MySQL没有检测到函数依赖,默认情况下也没有启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为,请参阅MySQL 5.6参考手册。 )
        标准SQL的MySQL扩展允许在HAVING子句中引用select列表中的别名表达式。在MySQL 5.7.5之前,启用ONLY_FULL_GROUP_BY将禁用此扩展,因此需要使用无别名表达式编写HAVING子句。从MySQL 5.7.5开始,这个限制被取消了,因此HAVING子句可以引用别名,而不管是否启用了ONLY_FULL_GROUP_BY。
        有关更多的讨论和示例,请参见12.20.3节,“MySQL对GROUP BY的处理”。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

曾经由盛转衰的骈文,却引领后人在文质兼美的创作之路上坚定前行

又叫骈体文,是和散文相对应的一种文体,它兴起于汉末,形成于魏晋,最盛行于南北朝,在初唐、中唐、唐末、五代、宋初时也盛极一时。古人语:两马并驾为骈,所以骈文最大的特点是用对偶的手法&#xf…

Fiddler抓包工具之fiddler设置手机端抓包

fiddler设置手机端抓包 安卓手机抓包 第一步:配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内;首先从fiddler处获取到ip地址和端口号: ,点击online,最后一行就是ip地址 2、路径:Tools》O…

数据库基础——10.子查询

这篇文章来讲一下数据库的子查询 目录 1. 需求分析与问题解决 1.1 实际问题 1.2 子查询的基本使用 1.3 子查询的分类 2. 单行子查询 2.1 单行比较操作符 2.2 代码示例 2.3 HAVING 中的子查询 2.4 CASE中的子查询 2.5 子查询中的空值问题 2.5 非法使用子查询​编辑…

数字IC验证高频面试问题整理(附答案)

后台有同学私信想要验证的面试题目,这不就来了~ Q1.权重约束中”:”和 /”的区别 : 操作符表示值范围内的每一个值的权重是相同的,比如[1:3]:40,表示1,2,3取到的概率为40/120; :/操作符表示权重要平均分到值范围内的…

spring security(密码编码器、授权,会话)

目录 密码编码器 授权决策 AffirmativeBased ConsensusBased UnanimousBased 授权 web授权 HttpSecurity常用方法及说明 方法授权 会话控制 会话超时 安全会话cookie 密码编码器 Spring Security为了适应多种多样的加密类型,又做了抽象,D…

虚拟机配置

配置虚拟机网络 创建虚拟机 20G 4G内存 初始化用户名和密码 zhao 123456 克隆拷贝2个虚拟机 配置内存为2G 修改主机名和固定IP hostnamectl set-hostname node1 hostnamectl set-hostname node2 vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl stop network s…

渗透测试辅助工具箱

0x01 说明 渗透测试辅助工具箱 运行条件:jdk8 双击即可运行 反弹shell,命令生成器,自动编码,输入对应IP端口即可,实现一劳永逸,集成一些小工具,辅助渗透,提高效率 输入框说明 L…

TDengine 报错 failed to connect to server, reason: Unable to establish connection

一、前文 TDengine 入门教程——导读 二、遇到问题 taos 命令行(CLI)连接不上,进不去。 [rootiZ2ze30dygwd6yh7gu6lskZ ~]# taos Welcome to the TDengine Command Line Interface, Client Version:3.0.0.1 Copyright (c) 2022 by TDengine…

基于Azure实现Java访问OpenAI

之前使用了Java代码访问OpenAI:OpenAI注册以及Java代码调用_雨欲语的博客-CSDN博客但是需要vpn才能访问,现在可以基于微软的Azure访问OpenAI,不再需要vpn,官方文档:快速入门 - 开始通过 Azure OpenAI 服务使用 ChatGPT…

【国产虚拟仪器】基于JFM7K325T(复旦微FPGA)的高速数据采集平台

板卡概述 XM714是自主研制的一款5路HD-SDI视频采集图像处理平台,该平台采用上海复旦微的高性能Kintex系列FPGA加上华为海思的高性能视频处理器HI3531DV200来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎,支持多种…

python:容器:字符串——常用操作

字符串[下标]根据下标索引取出特定位置字符字符串.index(字符串)查找给定字符的第一个匹配项的下标字符串.replace(字符串1,字符串2) 将字符串内的全部字符串1,替换为字符串2 不会修改原字符串,而是得到一个新的 字符串.split(字符串) 按照给定字符串&am…

[高光谱]使用PyTorch的dataloader加载高光谱数据

本文实验的部分代码参考 Hyperspectral-Classificationhttps://github.com/eecn/Hyperspectral-Classification如果对dataloader的工作原理不太清楚可以参见 [Pytorch]DataSet和DataLoader逐句详解https://blog.csdn.net/weixin_37878740/article/details/129350390?spm1001…

使用Nextcloud搭建私人云盘,并内网穿透实现公网远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章:使用Nextcl…

好程序员:如果你从6月份开始学Java编程......

现在学习Java编程还来得及?好程序员可以明确的告诉你:当然了~新手入门快,非常容易学。Java计算机语言也是一门面向对象的语言,更加符合人类的思想,所求皆对象,并没有指针等一些难理解的知识。Java覆盖面宽、…

2023最新软件测试面试题大全(包含答案)

前言 在我认为,对于测试面试以及进阶的最佳学习方法莫过于刷题博客书籍视频总结,前几者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现面试并不难,其次就是在刷题的过程中有没有去思…

Power BI许可证差异(免费、Pro、PPU、Embedded、Premium)

不可否认,在商业BI软件中Power BI是最强大的,在2023年的Gartner的魔力象限中Power BI又是第一名Microsoft named a Leader in the 2023 Gartner Magic Quadrant™ for Analytics and BI PlatformsI[1] image.png 目前还没有使用Power BI的,甚…

Microsoft Build 发布,开发者可能关注的重点→

又是一年一度的 Microsoft Build 了,你有和我一样熬夜看了吗?如果没有,那么你就错过了一场精彩的技术盛宴。本次的 Microsoft Build,有非常多的干货,围绕打造 Copilot 应用展开。我会将基于 Data AI 比较重要的内容列…

2.1. 类与对象

在 Java 中,类和对象是面向对象编程的基本构建块。类是一种模板,用于定义对象的属性和行为。对象是类的实例,具有类定义的属性和行为。 2.1.1. 类的定义 要定义一个类,可以使用以下语法: class ClassName {// 成员变…

Java学习路线(17)——日志框架

一、日志技术概述 (1)概念: 日志是一种将系统运行信息封装至文件的一种记录载体。 (2)优势: 输出语句日志技术输出位置只能是控制台文件或数据库取消日志需要修改代码达成无需修改代码多线程性能较差性能较…

AcrelEMS企业微电网能效管理系统-强化电力需求侧管理,缓解电力系统峰值压力

摘要 近年来全国用电负荷特别是居民用电负荷的快速增长,全国范围内夏季、冬季用电负荷“双峰”特征日益突出,极端气候现象多发增加了电力安全供应的压力。具有随机性、波动性、间歇性特征的可再生能源大规模接入电网对电力系统的稳定性带来新的挑战&…