SQL 子查询中,查询了一个不存在的字段,居然不报错

news2024/11/13 10:04:12

前言

前几天在做一个需求,用户所在的部门被删除了,对应用户的角色也要清空。测试测的时候发现,只要测我的这个需求系统的所有角色都被删除了。。。。。。。

我看了日志也没报错呀,我也没有删除所有账号的角色呀。我有点不相信,就再让测试测一下,发现真的执行了我的需求,账号角色立马就没了。

问题描述

下面删除角色的SQL,仔细一看 子查询的 user_id 字段写错了,卧槽t_user 中没有 user_id字段呀为什么不报错呢

DELETE 
FROM
	t_user_role 
WHERE
	user_id IN ( SELECT user_id FROM t_user WHERE org_id = 1 );

原来是 ( SELECT user_id FROM t_user WHERE org_id = 1 )子查询中这段SQL写错了,t_user 中没有 user_id 这个字段。

是不是很奇怪,单独执行 SELECT user_id FROM t_user WHERE org_id = 1确实会报错:

1054 - Unknown column ‘user_id’ in ‘field list’

但是我们执行整个SQL:

Affected rows: 3

分析问题

  1. 数据版本问题、或者是数据库类型的问题吗 ?
    都不是。因为最开始我用的国产数据库kingbase,以为是国产数据库的bug,结果换成mysql,还是一样。
  2. 难道用了in语法,导致里面报错,会忽略这个条件?
    不是。把里面的user_id 字段,换成了外层表和内层表都没有的字段,却会报错。
  3. 那就是子查询里面的字段,虽然在子查询表中不存在,但是外层表存在,就不会报错,sql底层肯定是做了什么处理?
    对。去网上搜了一下比较官方的解释就是,子查询里面出现字段不存在就会去外层表查询

在这里插入图片描述

翻译如下:如果在子查询中引用的列不存在于子查询的FROM子句引用的表中,但存在于外部查询的FROM语句引用的表内,则查询执行时不会出错。SQL Server使用外部查询中的表名隐式限定子查询中的列

解决方案

子查询中,大家还是把字段的限定名加上吧

测试SQL脚本需要自取

建表

-- 建表
CREATE TABLE `t_user` (
  `id` varchar(32) NOT NULL COMMENT '主键id',
  `username` varchar(100) DEFAULT NULL COMMENT '登录账号',
  `password` varchar(255) DEFAULT NULL COMMENT '密码',
  `org_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_sys_user_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';

CREATE TABLE `t_user_role` (
  `id` varchar(32) NOT NULL COMMENT '主键id',
  `user_id` varchar(32) DEFAULT NULL COMMENT '用户id',
  `role_id` varchar(32) DEFAULT NULL COMMENT '角色id',
  `tenant_id` int(10) DEFAULT '0' COMMENT '租户ID',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_sur_user_id` (`user_id`) USING BTREE,
  KEY `idx_sur_role_id` (`role_id`) USING BTREE,
  KEY `idx_sur_user_role_id` (`user_id`,`role_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户角色表';

-- 插入数据
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1788833429027057666', 'f38bfcc5-342a-4a3d-be37-06c6b76a3f3c', '63591882b6c1f51e606b3f2707c0782ee7eb9785ff03088a0b23cf3e8d3da7f852e9253a521518bf132', 6);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1793887804468568065', '6d4b31fb-15c1-4769-8360-4520654ec215', '13', 7911717);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1805118368626364418', '89ad452a-8301-408f-b0cb-a88514d20808', '13', 9267);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1806245320191922178', '555e353e-ac5e-49f6-aa14-3dec585c07e1', '123', 1);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1810256812759429121', '5c852068-a580-4d93-b6d0-8c9eba2d779a', '123', 16);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1810498373703282689', '1e564564-c034-4cf2-a8ac-06c71bd1c598', '3213', 1);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1811311348454297602', 'c92a96cd-c114-47d7-b73d-de69d4db11e6', '2', 9267);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('1811323232628805633', '4209f8ed-b4c2-4e21-8c66-1ad95ed35030', 'a044b591cc9dd85f28504f07bd1a6fbfac2913331cb5858012a13e9c50321d6baed824038132277f0', 1);
INSERT INTO `lf-tes`.`t_user` (`id`, `username`, `password`, `org_id`) VALUES ('e9ca23d68d884d4ebb19d07889727dae', '123', '9dab18c9eae63a19', 9267);

INSERT INTO `lf-tes`.`t_user_role` (`id`, `user_id`, `role_id`, `tenant_id`) VALUES ('1', '1788833429027057666', '1', 0);
INSERT INTO `lf-tes`.`t_user_role` (`id`, `user_id`, `role_id`, `tenant_id`) VALUES ('2', '1788833429027057666', '2', 0);
INSERT INTO `lf-tes`.`t_user_role` (`id`, `user_id`, `role_id`, `tenant_id`) VALUES ('3', '1788833429027057666', '3', 0);
INSERT INTO `lf-tes`.`t_user_role` (`id`, `user_id`, `role_id`, `tenant_id`) VALUES ('4', '1805118368626364418', '1', 0);
INSERT INTO `lf-tes`.`t_user_role` (`id`, `user_id`, `role_id`, `tenant_id`) VALUES ('5', '1811311348454297602', '1', 0);


测试脚本

DELETE 
FROM
	t_user_role 
WHERE
	user_id IN ( SELECT user_id FROM t_user WHERE org_id = 1 );

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

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

相关文章

(一)原生js案例之图片轮播

原生js实现的两种播放效果 效果一 循环播放&#xff0c;单一的效果 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

4款良心软件,免费又实用,内存满了都舍不得卸载

以下几款高质量软件&#xff0c;若是不曾体验&#xff0c;实在是遗憾可惜。 PDF Guru 这是一款开源免费的PDF编辑软件&#xff0c;打开之后功能一目了然。 可以拆分、合并PDF&#xff0c;也可以给PDF添加水印和密码&#xff0c;同时也可以去除别人PDF里的水印或密码&#xff0…

状态管理的艺术:探索Flutter的Provider库

状态管理的艺术&#xff1a;探索Flutter的Provider库 前言 上一篇文章中&#xff0c;我们详细介绍了 Flutter 应用中的状态管理&#xff0c;以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式&#xff1a;Provider。 Provider优缺点 基…

Spock单元测试框架使用介绍和实践

背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计&#xff0c;单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…

STM32 UART 硬件结构

访问串口与读写内存无差&#xff0c;串口将寄存器中的值通过数据线一位一位的传输出去 协议 设置波特率&#xff0c;数据位 115200 8 n 1 BSRR/CR 查询方式进行数据的发送与接收 &#xff08;在一个while循环中判断状态&#xff0c;然后读取数据&#xff09; 1、发送…

在线商城系统带万字文档java项目java课程设计java毕业设计

文章目录 在线商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 在线商城系统 一、项目演示 在线商城系统 二、项目介绍 基于springbootvue的前后端分离在线商…

Vue3滚动条(Scrollbar)

效果如下图&#xff1a;在线预览 APIs Scrollbar 参数说明类型默认值必传contentStyle内容样式CSSProperties{}falsesize滚动条的大小&#xff0c;单位 pxnumber5falsetrigger显示滚动条的时机&#xff0c;none 表示一直显示‘hover’ | ‘none’‘hover’falsehorizontal是否…

【韩顺平零基础学java】第17章补充笔记记录

1.线程终止 线程完成任务后会自动退出 或者可以使用变量来控制run方法退出的方式终止线程&#xff0c;即通知方式 【例】Threadexit 启动一个线程T。要求在main方法中终止线程T public class ThreadExit_ {public static void main(String[] args) throws InterruptedExcepti…

网络故障处理及分析工具:Wireshark和Tcpdump集成

Wireshark 是一款免费的开源数据包嗅探器和网络协议分析器&#xff0c;已成为网络故障排除、分析和安全&#xff08;双向&#xff09;中不可或缺的工具。 本文深入探讨了充分利用 Wireshark 的功能、用途和实用技巧。 无论您是开发人员、安全专家&#xff0c;还是只是对网络操…

Unity格斗游戏,两个角色之间互相锁定对方,做圆周运动

1&#xff0c;灵感来源 今天手头的工作忙完了&#xff0c;就等着服务器那边完活&#xff0c;于是开始研究同步问题。 正好想到之前想做的&#xff0c;两个小人对线PK&#xff0c;便有了这篇文章。 2&#xff0c;要实现的效果 如图所示&#xff0c;两个小人可以互相锁定&…

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

linux shell脚本编程(分支语句、循环语句)

一、分支语句 1、语法结构 : if 表达式 then 命令表 fi 如果表达式为真 , 则执行命令表中的命令 ; 否则退出 if 语句 , 即执行 fi 后面的语句。 if 和 fi 是条件语句的语句括号 , 必须成对使用 ;命令表中的命令可以是一条 , 也可以是若干条。 2、语法结构为 : if 表达式 t…

Flink源码学习资料

Flink系列文档脑图 由于源码分析系列文档较多&#xff0c;本人绘制了Flink文档脑图。和下面的文档目录对应。各位读者可以选择自己感兴趣的模块阅读并参与讨论。 此脑图不定期更新中…… 文章目录 以下是本人Flink 源码分析系列文档目录&#xff0c;欢迎大家查阅和参与讨论。…

leetcode日记(42)螺旋矩阵

我使用的是递归&#xff0c;每次递归遍历一圈矩阵&#xff0c;将遍历结果塞进结果vector中&#xff0c;每次遍历修改上下左右边界&#xff0c;直至遍历后其中两边界重合或交错。 class Solution { public:vector<int> spiralOrder(vector<vector<int>>&…

MySQL双主双从实现方式

双主双从&#xff08;MM-SS&#xff09; 前言 避免单一主服务器宕机&#xff0c;集群写入能力缺失 从 1 复制 主1 &#xff0c;从 2 复制 主 2 主 1 复制 主 2&#xff0c;主 2 复制主 1 也就是 主 1 和主 2 互为主从。主1主2互为主从&#xff0c; 是为了以下情景&#xff0c…

Fork_Join模式:分治和Work-Stealing的完美结合

引言 在计算机科学领域&#xff0c;解决大规模数据和复杂计算任务的需求促使了并行计算模型的发展。Fork/Join模式以其独特的分治和Work-Stealing结合的方式&#xff0c;成为解决可分解并行问题的一项卓越选择。本文将重点探讨Fork/Join模式中分治和Work-Stealing的关键优势&a…

【网络】掌握网络基础概念

文章目录 OSI七层模型TCP/IP五层&#xff08;或四层&#xff09;模型为什么要有TCP/IP协议网络传输的基本流程网络传输流程图数据包封装和分用 网络中的地址管理IP地址Mac地址比较IP地址和Mac地址 OSI七层模型 OSI即Open System Interconnection,开发系统互连。OSI七层模型是一…

电气电工增加收入需规避的16大陷阱

电工接线是电气工程中非常重要的环节&#xff0c;为什么实施项目之后&#xff0c;存在电工叫苦&#xff0c;老板说亏&#xff0c;这到底是什么原因&#xff1f;是什么影响了电工的效率&#xff0c;阻碍了电工收入的增加&#xff1f; 下面我们汇总一下平时在项目中遇到的陷阱&a…

spring核心内容基本解读、spring中IOC控制反转入门案例,debug带你剖析Spring容器机制和结构(图文讲解,简单易懂)。

目录 1.spring核心内容大概解读 2.spring的IOC(控制反转容器机制剖析) 2.1 来份快速入门案例 2.2 debug剖析spring容器的机制和结构 1.spring核心内容大概解读 1. 在线文档 : https://docs.spring.io/spring-framework/docs/current/reference/html/ 2. 离 线 文 档 …

STM32智能健康监测系统教程

目录 引言环境准备智能健康监测系统基础代码实现&#xff1a;实现智能健康监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;健康监测与管理问题解决方案与优化收尾与总结 1. 引言 智能健康监测系统通…