需求:依照标准的 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()-- 开始BEGINDECLARE 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:LOOPFETCH c_borrow INTO dcpsid1,dcpsid2;IF done THENLEAVE 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_dcpsALTER TABLE d_dcps;
