iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >子查询更新操作的坑
  • 276
分享到

子查询更新操作的坑

2024-04-02 19:04:59 276人浏览 泡泡鱼
摘要

子查询我相信大部分人都写过,但是昨天遇到一个比较坑的问题,由于有较好的备份,很短时间就恢复了误操作数据,但是这个问题值得分享。首先建立如下测试表:CREATE TABLE course (student_i

子查询我相信大部分人都写过,但是昨天遇到一个比较坑的问题,由于有较好的备份,很短时间就恢复了误操作数据,但是这个问题值得分享。
首先建立如下测试表:
CREATE TABLE course (
student_id INT(11),
course VARCHAR(20)
);
INSERT INTO course VALUES ('1', '测试1');
INSERT INTO course VALUES ('2', '测试2');
INSERT INTO course VALUES ('3', '测试3');

CREATE TABLE student (
id INT(11),
name VARCHAR(20)
) ;
INSERT INTO student VALUES ('1', 'jiate');
INSERT INTO student VALUES ('2', 'haoshen');
INSERT INTO student VALUES ('3', 'leishen');
INSERT INTO student VALUES ('4', 'tetui');

子查询更新操作的坑

现在我们执行如下查询操作:
SELECT FROM student WHERE id IN (SELECT id FROM course)
子查询更新操作的坑
这个结果很明显,多了一条。而在昨天,我们开发写的是个update 操作,也是就:update student set name='特腿' where id in (select id from course) 本来更新1000条的数据,开发直接误更新了40万条。
仔细排查后,发现刚才两条sql发现 course 中根本就不存在id列,那么刚才那两条sql为啥没有抛出id报错,而是直接全表匹配了?
我们 desc extended 看看优化器究竟干了什么?
DESC EXTENDED SELECT
FROM student WHERE id IN (SELECT id FROM course)

SHOW WARNINGS

子查询更新操作的坑
第一行1276 大意是说第二个查询中的 id 列在第一个表中被解析到
第二行就是解析器解析后的sql,我们贴出来看看
SELECT
yhtest.student.id AS id,
yhtest.student.name AS name
FROM
yhtest.student semi
JOIN (yhtest.course)
WHERE (
yhtest.student.id = yhtest.student.id
)

也就是说我们这个子查询中的id 列被解析为了主表的id 列,这样,where 条件是一个恒成立的条件,所以导致我们的查询过结果是a表的全表结果,而这也是这样的查询不抛错的原因。
子查询中的字段,首先会在子查询中查找,1)如果子查询中没该字段,则会去外层主表查找,如果能找到,也不会抛错! 2)如果子查询和主表中都没有该字段,则会抛错。
这其实是一个比较不理想的结果,如果我们无意中错误是update操作,那么这个结果太糟糕。
这个我们提了两个醒:
1)做数据库操作之前,最好都备份
2)平时写sql的时候,子查询尽量都写成表关联的形式,表关联形式,如果出现这种错误,会直接抛出错误。子查询形式,虽然好懂,一目了然,但是性能一般不大好,再一个,如果掉进了以上这种误更新坑中......
3)在不同版本的数据库对于子查询的优化操作也是不尽相同,性能差异在不同版本之间还是比较明显的。

您可能感兴趣的文档:

--结束END--

本文标题: 子查询更新操作的坑

本文链接: https://www.lsjlt.com/news/35181.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在oracle中查询操作子查询
    怎么在oracle中查询操作子查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、子查询语法SELECT select_l...
    99+
    2024-04-02
  • 操作更新Excel工作表时,必须使用一个可更新的查询
    查询是一种用于从数据库中检索数据的技术,而Excel工作表并不是数据库。因此,不需要使用可更新的查询来更新Excel工作表。相反,您...
    99+
    2023-09-26
    Excel
  • 怎么用php操作mysql更新查询结果
    PHP和MySQL是两种非常流行的编程语言和数据库管理系统,在现代IT领域被广泛使用。当一个网站或应用程序被开发时,PHP和MySQL被广泛用来实现更新和查询数据。当一个PHP页面从MySQL数据库中查询数据时,特别是当数据被修改时,常常需...
    99+
    2023-05-14
    php mysql 数据库
  • 如何用php操作mysql更新查询结果
    这篇文章主要介绍“如何用php操作mysql更新查询结果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用php操作mysql更新查询结果”文章能帮助大家解决问题。1. 使用AJAX在现代前端开发...
    99+
    2023-07-05
  • 使用elasticsearch原子操作更新
    本篇文章向大家介绍《使用elasticsearch原子操作更新》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。问题内容func (d *Dynamic) Like(ctx *gin.Con...
    99+
    2024-04-04
  • System.Data.OleDb.OleDbException:操作必须使用一个可更新的查询
    这个异常表示执行的操作需要使用可更新的查询。在使用OleDb进行数据库操作时,有一些情况下可能会出现这个异常。以下是一些可能引发此异...
    99+
    2023-09-26
    查询
  • MySQL子查询操作实例详解
    本文实例总结了MySQL子查询操作。分享给大家供大家参考,具体如下: 定义两个表tb1和tb2 CREATE table tbl1 ( num1 INT NOT NULL); CREATE table ...
    99+
    2024-04-02
  • 在SQLServer中使用子查询更新语句
    测试环境准备 create table #table1 ( id int , name varchar(20) ); go create table #t...
    99+
    2024-04-02
  • MySQL的查询操作
    1. 基础的查询操作 #简单查询 select * from emp; //查询emp中所有的记录 select empno, job,ename from emp; //查询em...
    99+
    2024-04-02
  • Mysql---子查询的三种查询方式( 表子查询,条件子查询,列中子查询)
    mysql子查询 子查询分为: 列中子查询 单列单行表子查询 必须有别名条件子查询 单行单列 多行单列 下列示例表结构: grade表: result表: student表: subject表:...
    99+
    2023-09-04
    mysql sql 数据库
  • 同时对同一张表进行插入、查询和更新操作
    可能会出现以下问题: 数据不一致:如果在查询和更新操作之间发生了插入操作,查询操作可能会返回不完整的数据。同样,如果在插入和更新操作之间发生了查询操作,更新操作可能会使用不完整的数据进行更新。 死锁:如果多个线程同时访问同一张表,并且它们对...
    99+
    2023-08-18
    数据库 mysql c#
  • Hive如何处理复杂的JOIN操作和子查询
    Hive处理复杂的JOIN操作和子查询时,可以通过以下方法来优化查询性能: 使用合适的JOIN算法:Hive支持多种JOIN算法...
    99+
    2024-03-11
    Hive
  • 深入解析Golang中链表的插入、删除、更新和查询操作
    Golang 中链表的增删改查操作详解 链表(linked list)是一种常见的数据结构,它由一组结点(node)组成,每个结点包含数据和指向下一个结点的指针。相比于数组,链表的优势在于插入和删除操作的时间...
    99+
    2024-01-29
    链表 (链表)
  • PostgreSQL数据库视图及子查询使用操作
    目录视图创建视图使用视图视图更新:删除视图:子查询关联子查询视图 表里面保存的是实际数据,视图里面保存的是SELECT语句(视图本身不存储数据)。 从视图中读取数据,此时视图...
    99+
    2024-04-02
  • MySQL慢查询的坑
    目录一、慢查询配置 1-1、开启慢查询 二、Explain分析慢查询SQL 三、一些慢查询优化经验分享 3-1、优化LIMIT分页 3-2、排查索引没起作用的情况 总结 一条慢查询会...
    99+
    2024-04-02
  • Django Models 查询操作
    1.准备数据表: from django.db import models class City(models.Model): name=models.CharField(max_length=32) nid=models.AutoF...
    99+
    2023-01-30
    操作 Django Models
  • 如何实现关联子查询Update语句更新数据
    本篇内容主要讲解“如何实现关联子查询Update语句更新数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现关联子查询Update语句更新数据”...
    99+
    2024-04-02
  • Java操作mongodb的模糊查询和精确查询
    本意是想查查mongo数据库的int类型的like怎么查,但是好像没 解决这个问题。 精确查询;模糊查询;分页查询,每页多少:按某个字段排序(或升或降):查询数量:大于,小于,等于;且,或,某个字段不为空,...
    99+
    2024-04-02
  • MySQL查询学习之基础查询操作
    前言 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:...
    99+
    2024-04-02
  • LINQ查询操作分析
    这篇文章主要介绍“LINQ查询操作分析”,在日常操作中,相信很多人在LINQ查询操作分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LINQ查询操作分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!LI...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作