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

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次就好] 一般时间为几毫秒到几十毫秒不等

你可能感兴趣的:(数据库,-,mysql)