MySql - 快速执行:在update时使用select赋值
#
不允许SELECT FROM后面指向用作UPDATE的表。
不允许UPDATE在SET时直接SELECT
, you cannot update a table and select from the same table in a subquery.[other table 也是一样]
是通过临时表来实现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次数()+1次,[100-5000]次不等,一般就几百次,不确定执行次数。
// 第四个,使用UPDATE SELECT
1.List掉本表,取出所有需要更新值的行,并关联掉需要赋值的值,GROUP BY掉相同类型。
2.循环每一个类型
2.1通过UPDATE SELECT按类型直接更新
// 执行完毕,执行SQL次数List.size()+1次,[100-5000]次不等,一般就几百次,不确定执行次数。
// 第四个并不能保证比第三个执行速度更快。
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次就好] 一般时间为几毫秒到几十毫秒不等