需求:依照标准的 d_dcps 表(d_dcps_base),修改旧版本中的 d_dcps 表对应的关联表 d_device。


    准备:
    新增一张标准的 d_dcps_base 表,然后根据 d_dcps_base 和 d_dcps 对比,进而修改 d_device 表。

    1. -- 删除自定义存储过程(如果存在的话)
    2. DROP PROCEDURE if EXISTS update_relation_by_dcpsid;
    3. -- 定义存储过程
    4. create PROCEDURE update_relation_by_dcpsid()
    5. -- 开始
    6. BEGIN
    7. DECLARE done INT DEFAULT FALSE;
    8. DECLARE dcpsid1 varchar(20);
    9. DECLARE dcpsid2 varchar(20);
    10. DECLARE tempt_add varchar(20) DEFAULT "temp_";
    11. 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;
    12. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    13. OPEN c_borrow;
    14. read_loop:LOOP
    15. FETCH c_borrow INTO dcpsid1,dcpsid2;
    16. IF done THEN
    17. LEAVE read_loop;
    18. END IF;
    19. -- 执行"更新"操作,为了避免修改后的数据和原有数据的值相同,导致后续的修改一致,每个符合条件的值都新增一个临时值 tempt_add
    20. update d_device a set a.dcpsid = CONCAT("temp_",dcpsid2) where a.dcpsid = dcpsid1;
    21. -- 结束循环(END)
    22. END LOOP;
    23. CLOSE c_borrow;
    24. END;
    25. -- 调用存储过程
    26. call update_relation_by_dcpsid();
    27. -- 将临时增加的常量去掉
    28. UPDATE d_device SET dcpsid = REPLACE (dcpsid, "temp_", "") WHERE dcpsid LIKE "temp_%";
    29. -- d_dcps 表删除
    30. DROP TABLE d_dcps;
    31. -- d_dcps_base 重命名为 d_dcps
    32. ALTER TABLE d_dcps;