需求:依照标准的 d_dcps 表(d_dcps_base),修改旧版本中的 d_dcps 表对应的关联表 d_device。
准备:
新增一张标准的 d_dcps_base 表,然后根据 d_dcps_base 和 d_dcps 对比,进而修改 d_device 表。
-- 删除自定义存储过程(如果存在的话)
DROP PROCEDURE if EXISTS update_relation_by_dcpsid;
-- 定义存储过程
create PROCEDURE update_relation_by_dcpsid()
-- 开始
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE dcpsid1 varchar(20);
DECLARE dcpsid2 varchar(20);
DECLARE tempt_add varchar(20) DEFAULT "temp_";
DECLARE c_borrow CURSOR FOR select a.dcpsid as old,b.dcpsid as new from d_dcps a left join d_dcps_base b on a.dcpsname = b.dcpsname where a.dcpsid!= b.dcpsid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN c_borrow;
read_loop:LOOP
FETCH c_borrow INTO dcpsid1,dcpsid2;
IF done THEN
LEAVE read_loop;
END IF;
-- 执行"更新"操作,为了避免修改后的数据和原有数据的值相同,导致后续的修改一致,每个符合条件的值都新增一个临时值 tempt_add。
update d_device a set a.dcpsid = CONCAT("temp_",dcpsid2) where a.dcpsid = dcpsid1;
-- 结束循环(END)
END LOOP;
CLOSE c_borrow;
END;
-- 调用存储过程
call update_relation_by_dcpsid();
-- 将临时增加的常量去掉
UPDATE d_device SET dcpsid = REPLACE (dcpsid, "temp_", "") WHERE dcpsid LIKE "temp_%";
-- 将 d_dcps 表删除
DROP TABLE d_dcps;
-- 将 d_dcps_base 重命名为 d_dcps
ALTER TABLE d_dcps;