MySql - 快速执行:在update时使用select赋值

举报
简简单单Onlinezuozuo 发表于 2022/02/18 23:22:36 2022/02/18
【摘要】 MySql - 快速执行:在update时使用select赋值 # 1.MySQL不允许SELECT FROM后面指向用作UPDATE的表。 2.MySQL不允许UPDATE在SET时直接SEL...

MySql - 快速执行:在update时使用select赋值


#

1.MySQL不允许SELECT FROM后面指向用作UPDATE的表。

2.MySQL不允许UPDATE在SET时直接SELECT

3.Currently, you cannot update a table and select from the same table in a subquery.[other table 也是一样]

4.MySQL是通过临时表来实现FROM子句里面的嵌套查询

1.需要解决的问题

1.你想要更新一张表的某个字段,这个字段的值就在这条记录本身,或者,在这张表的关联表里面。
2.你在某个表新增了一条字段,该字段的值在本表或者本表的关联表,你需要对以前的现有数据进行赋值。
【需求点是:当你更新了关联表的字段值时,这个值仍然被本表保存,而互不影响】

2.解决方法和演变

假设数据有10000条

// 第一个
1.List掉本表,取出所有需要更新值的行。
2.循环每一行
    2.1通过SQL取出关联表的记录的值。
    2.2把这个值更新到本表。
// 执行完毕,执行SQL - 20001次
  
 

// 第二个
1.List掉本表,取出所有需要更新值的行,并关联掉需要赋值的值。
2.循环每一行
    2.1从行中取出该值,传递到赋值的SQL
    2.2把这个值更新到本表。
// 执行完毕,执行SQL - 10001次
  
 

// 第三个
// 分析:一般这种表有相同类型记录,可对记录GROUP BY只保留不同类型
1.List掉本表,取出所有需要更新值的行,并关联掉需要赋值的值,GROUP BY掉相同类型。
2.循环每一个类型
    2.1从类型中取出该值,传递到赋值的SQL
    2.2把这个值更新到本表的同类型记录。
// 执行完毕,执行SQL次数List.size()+1次,[100-5000]次不等,一般就几百次,不确定执行次数。
  
 

// 第四个,使用UPDATE SELECT
1.List掉本表,取出所有需要更新值的行,并关联掉需要赋值的值,GROUP BY掉相同类型。
2.循环每一个类型
    2.1通过UPDATE SELECT按类型直接更新
// 执行完毕,执行SQL次数List.size()+1次,[100-5000]次不等,一般就几百次,不确定执行次数。

// 第四个并不能保证比第三个执行速度更快。
  
 

3.UPDATE SELECT

UPDATE table_a AS tb_a SET tb_a.field = 
    // 对嵌套里面的临时值进行外围引用
    (
        // 嵌套查询,产生了临时表 - 值保存操作
        SELECT temp_a.field FROM 
        (
            // FROM 嵌套查询,产生了临时表 - 查询操作
            SELECT tb_b.field FROM table_b AS tb_b
            WHERE tb_b.id = #{id}
        ) AS temp_a
    )
// 一次性更新相同类型的记录
WHERE tb_a.field_group = #{id}
  
 

4.表关联更新

了解了UPDATE - SELECT嵌套,这件事情还可以使用表关联更新来实现。

UPDATE table_a tb_a,table_b tb_b SET tb_a.field= tb_b.field
WHERE tb_a.relation_id= tb_b.relation_id

// SQL语句执行 [1次就好] 一般时间为几毫秒到几十毫秒不等
  
 

文章来源: wretchant.blog.csdn.net,作者:简简单单OnlineZuozuo,版权归原作者所有,如需转载,请联系作者。

原文链接:wretchant.blog.csdn.net/article/details/79001487

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。