项目整合.sql 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. -- 2019年1月17日11:19:45
  2. -- 项目整合规则:
  3. -- 超级前台部分,保留id小的,删除id大的
  4. -- 超级前台--服务之窗部分,保留服务之窗,删除超级前台
  5. -- 1.编写存储过程,对两个项目合并
  6. -- 将语句的结束符号从分号;临时改为两个$$(可以是自定义)
  7. delimiter $$
  8. -- 存储过程(项目数据整合)
  9. drop procedure if exists sync_org;
  10. -- 定义存储过程
  11. -- reserve_orgId:保留的项目id del_orgId:删除的项目id
  12. CREATE PROCEDURE sync_org(in reserve_orgId INT,in del_orgId INT)
  13. BEGIN
  14. -- 创建接收游标数据的变量
  15. declare table_name VARCHAR(50);
  16. declare column_name varchar(50);
  17. -- 循环结束标识,为true时结束循环
  18. DECLARE done int DEFAULT FALSE;
  19. -- 创建游标
  20. DECLARE cur CURSOR FOR
  21. SELECT
  22. t1.TABLE_NAME,
  23. t1.COLUMN_NAME
  24. FROM
  25. information_schema.`COLUMNS` t1
  26. LEFT JOIN information_schema.`TABLES` t2 ON t1.TABLE_NAME = t2.TABLE_NAME
  27. WHERE
  28. t1.COLUMN_NAME LIKE 'org%'
  29. AND t2.TABLE_ROWS > 0
  30. GROUP BY
  31. t1.TABLE_NAME;
  32. -- 指定游标循环结束时的标识 done改为true
  33. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
  34. -- 打开游标
  35. OPEN cur;
  36. -- 开始循环游标数据
  37. REPEAT
  38. FETCH cur INTO table_name,column_name;
  39. -- 声明sql执行模板
  40. SET @preSql =CONCAT('UPDATE ',table_name,' SET ',column_name,'=',reserve_orgId,' WHERE ',column_name,' = ',del_orgId);
  41. PREPARE stmt FROM @preSql;
  42. if not done THEN
  43. -- 需要执行的操作
  44. -- UPDATE table_name SET column_name=reserve_orgId WHERE column_name=del_orgId;
  45. EXECUTE stmt;
  46. DEALLOCATE PREPARE stmt;
  47. END IF;
  48. until done end repeat;
  49. -- 关闭游标
  50. CLOSE cur;
  51. -- 结束过程
  52. END $$
  53. -- 将语句的结束符号恢复为分号
  54. delimiter ; 
  55. -- 2.循环调用存储过程:sync_org(),对所有需要同步的项目进行同步
  56. -- 创建临时表存储项目整合的id
  57. DROP TABLE IF EXISTS `tb_sync_org`;
  58. CREATE TABLE `tb_sync_org` (
  59. `id` BIGINT (20) NOT NULL AUTO_INCREMENT,
  60. `reverse_id` INT (11) DEFAULT NULL COMMENT '保留的项目id',
  61. `del_id` INT (11) DEFAULT NULL COMMENT '删除的项目id',
  62. PRIMARY KEY (`id`)
  63. ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '项目整合临时表';
  64. -- 插入数据 超级前台数据整合部分
  65. INSERT INTO `tb_sync_org` (`reverse_id`, `del_id`)
  66. VALUES
  67. (55, 511),
  68. (101, 116),
  69. (171, 412),
  70. (38, 39),
  71. (38, 397),
  72. (336, 475),
  73. (103, 351),
  74. (107, 349),
  75. (36, 42),
  76. (114, 348),
  77. (363, 391),
  78. (498, 534),
  79. (394, 500);
  80. -- 正式数据库插入该数据;测试数据库注释掉;
  81. -- 插入数据 超级前台--服务之窗数据整合部分
  82. -- INSERT INTO `tb_sync_org` (`reverse_id`, `del_id`)
  83. -- VALUES
  84. -- (616, 11),
  85. -- (619, 362),
  86. -- (626, 6),
  87. -- (633, 288),
  88. -- (641, 421),
  89. -- (646, 390),
  90. -- (647, 370),
  91. -- (650, 195);
  92. -- 新建存储过程:循环整合项目数据
  93. -- 声明结束标识符为 $$
  94. delimiter $$
  95. -- 新建存储过程
  96. DROP PROCEDURE IF EXISTS begin_sync_org;
  97. CREATE PROCEDURE begin_sync_org()
  98. BEGIN
  99. -- 定义变量接收游标中保存的项目id
  100. DECLARE reserve_id INT;
  101. -- 定义变量接收游标中删除的项目id
  102. DECLARE del_id INT;
  103. -- 声明循环结束标识符
  104. DECLARE done int DEFAULT FALSE;
  105. -- 定义游标
  106. DECLARE cur CURSOR FOR SELECT t1.reverse_id,t1.del_id FROM tb_sync_org t1;
  107. -- 指定游标循环结束时的标识 done改为true
  108. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
  109. -- 打开游标
  110. OPEN cur;
  111. -- 开始循环
  112. REPEAT
  113. FETCH cur INTO reserve_id,del_id;
  114. if not done THEN
  115. -- 需要执行的操作
  116. CALL sync_org(reserve_id,del_id);
  117. END IF;
  118. until done end repeat;
  119. -- 关闭游标
  120. CLOSE cur;
  121. -- 结束过程
  122. END $$
  123. -- 声明结束标识符为 ;
  124. delimiter ;
  125. -- 调用存储过程进行同步
  126. -- CALL begin_sync_org();
  127. -- 删除临时表
  128. -- DROP TABLE IF EXISTS `tb_sync_org`;
  129. -- 删除被合并的项目
  130. -- UPDATE tb_organization SET isEnabled=0 WHERE ID IN(485,565,308,307,399,402,556,494,131,17,525,182,335,559,553,552,560,333,414,405,406,228,229,511,116,412,39,397,475,351,349,42,348,391,534,500,11,362,6,288,421,390,370,195);
  131. -- 删除存储过程
  132. -- drop procedure if exists begin_sync_org;
  133. -- drop procedure if exists sync_org;