请教mysql批量更新层级关系数据如何实现
有个地址表(数据量较大,百万级的) ,只给3个主要字段:地址id,地址等级,上级地址id:
select id,grade,parentid from addr
where id in (512589,106969,43072,281,7651,200087792,153,103,1)
;
ID GRADE PARENTID
1 1 1 0
2 103 2 1
3 153 3 103
4 281 5 7651
5 7651 5 200087792
6 43072 6 281
7 106969 7 43072
8 512589 8 106969
9 200087792 4 153
现在有个临时表 (10w级数据)
select stid, addr6 from tmp_addr;
需求是根据tmp_addr表的stid来更新所有记录的6级地址,
在oracle里可以这样实现:
update tmp_addr xx
set xx.addr6=(select id from addr where grade=6 and rownum=1 start with id=xx.stid connect by nocycle prior parentid=id)
;
请教下大家如何在mysql里实现这样的功能,我在网上搜了下很多是通过函数传一个参数id,然后用find_in_set,将所有父节点拼接起来,
但是这种每次只能查询一条记录的,我在存储过程里用游标循环试了下,实在是太慢了,tmp_addr 1w多记录就跑了1个多小时还没跑完,就放弃这种方法了,
大家有好的方法或方法,请不吝赐教,谢谢!
select id,grade,parentid from addr
where id in (512589,106969,43072,281,7651,200087792,153,103,1)
;
ID GRADE PARENTID
1 1 1 0
2 103 2 1
3 153 3 103
4 281 5 7651
5 7651 5 200087792
6 43072 6 281
7 106969 7 43072
8 512589 8 106969
9 200087792 4 153
现在有个临时表 (10w级数据)
select stid, addr6 from tmp_addr;
需求是根据tmp_addr表的stid来更新所有记录的6级地址,
在oracle里可以这样实现:
update tmp_addr xx
set xx.addr6=(select id from addr where grade=6 and rownum=1 start with id=xx.stid connect by nocycle prior parentid=id)
;
请教下大家如何在mysql里实现这样的功能,我在网上搜了下很多是通过函数传一个参数id,然后用find_in_set,将所有父节点拼接起来,
但是这种每次只能查询一条记录的,我在存储过程里用游标循环试了下,实在是太慢了,tmp_addr 1w多记录就跑了1个多小时还没跑完,就放弃这种方法了,
大家有好的方法或方法,请不吝赐教,谢谢!
...全文
相关推荐
MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程
**批量处理**:分批处理数据,而不是一次性处理所有数据,减少内存压力。3.
MySQL省市区街道4级数据
通过父级ID字段,可以建立各级行政区域之间的层级关系,实现快速的上下级查找。在导入和管理这些数据时,你需要了解以下MySQL关键知识点:1.
mysql 批量更新及效率对比
MySQL 批量更新的高效方法MySQL 批量更新是指在 MySQL 数据库中批量更新多条记录的操作。这种操作在实际应用中非常常见,例如批量更新用户信息、订单状态等。
Mysql Update批量更新的几种方式
在MySQL中,批量更新数据是常见的操作,尤其在处理大量数据时,效率至关重要。本文将介绍几种Mysql Update批量更新的常见方式。1.
Laravel实现批量更新多条数据
本文将详细介绍如何在Laravel中实现批量更新多条数据。首先,我们需要了解MySQL中的`CASE...WHEN`语句。这是一种非常实用的SQL构造,用于根据不同的条件设置字段的值。


