在实际项目常常使用联表更新的问题。
假设,有时候某个A表是空数据,需要重新创建数据,然后通过创建的数据与表B进行关联更新,且B中关联A中的字段ID。此时情况下,如何快速的将数据创建并对应。
本人实际工作中用到了这么个场景。
总结的方案如下:
首先创建表A,并且在表A中循环插入N条数据。
- 自定义函数,插入31条数据
DELIMITER $$
create function a_Data()
returns int
DETERMINISTIC
begin
declare num int default 31;
declare i int default 0;
while i<num DO
INSERT INTO A(id, isenable, notes, rate, ratedescription, taxitemid, version)VALUES(UUID(), '1', NULL, NULL, NULL, NULL, NULL);
set i=i+1;
end while;
return i;
end $$
delimiter;
Select a_Data();
此时新数据N条已经创建好,下面是如何将创建的数据与B表进行关联,赋值。
通过临时表给A与B排序
Mysql创建临时表的命令如下:
create temporary table a_table select * from A;
给数据增加rownum排序
SET @rownum:=0;
select * from (SELECT @rownum:=@rownum + 1 as rownum,A.* FROM A) AwithRownum;
通过以上知识,我们给表A与表B增加排序,并且创建临时表。
SET @raterownum:=0;
SET @itemrownum:=0;
create temporary table A_table
select
*
from
(
SELECT
@raterownum := @raterownum + 1 as arownum,
A.*
FROM
A) Arownum;
create temporary table B_table
SELECT
@itemrownum := @itemrownum + 1 as brownum ,
B.*
FROM
B
where
taxcategoryid = 'cf5d05df-cc33-7b98-578d-13008c20e288'
and layer = 2
order by
treeinfo_path;
创建A与B的数据映射关系:
create temporary table AmapB
select
A.id as AID,
B.id as BID
from
B_table
left join A_table on
B_table.brownum= A_table.arownum;
最后通过update更新A中的数据
update
A
JOIN B set
bid = B_table.id
where
A.bid = AmapB.BID;
最后把临时表删除
-- drop table A_table;
-- drop table B_table;
-- drop table AmapB;