-- 2019年1月17日11:19:45 -- 项目整合规则: -- 超级前台部分,保留id小的,删除id大的 -- 超级前台--服务之窗部分,保留服务之窗,删除超级前台 -- 1.编写存储过程,对两个项目合并 -- 将语句的结束符号从分号;临时改为两个$$(可以是自定义) delimiter $$ -- 存储过程(项目数据整合) drop procedure if exists sync_org; -- 定义存储过程 -- reserve_orgId:保留的项目id del_orgId:删除的项目id CREATE PROCEDURE sync_org(in reserve_orgId INT,in del_orgId INT) BEGIN -- 创建接收游标数据的变量 declare table_name VARCHAR(50); declare column_name varchar(50); -- 循环结束标识,为true时结束循环 DECLARE done int DEFAULT FALSE; -- 创建游标 DECLARE cur CURSOR FOR SELECT t1.TABLE_NAME, t1.COLUMN_NAME FROM information_schema.`COLUMNS` t1 LEFT JOIN information_schema.`TABLES` t2 ON t1.TABLE_NAME = t2.TABLE_NAME WHERE t1.COLUMN_NAME LIKE 'org%' AND t2.TABLE_ROWS > 0 GROUP BY t1.TABLE_NAME; -- 指定游标循环结束时的标识 done改为true DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; -- 打开游标 OPEN cur; -- 开始循环游标数据 REPEAT FETCH cur INTO table_name,column_name; -- 声明sql执行模板 SET @preSql =CONCAT('UPDATE ',table_name,' SET ',column_name,'=',reserve_orgId,' WHERE ',column_name,' = ',del_orgId); PREPARE stmt FROM @preSql; if not done THEN -- 需要执行的操作 -- UPDATE table_name SET column_name=reserve_orgId WHERE column_name=del_orgId; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; until done end repeat; -- 关闭游标 CLOSE cur; -- 结束过程 END $$ -- 将语句的结束符号恢复为分号 delimiter ;  -- 2.循环调用存储过程:sync_org(),对所有需要同步的项目进行同步 -- 创建临时表存储项目整合的id DROP TABLE IF EXISTS `tb_sync_org`; CREATE TABLE `tb_sync_org` ( `id` BIGINT (20) NOT NULL AUTO_INCREMENT, `reverse_id` INT (11) DEFAULT NULL COMMENT '保留的项目id', `del_id` INT (11) DEFAULT NULL COMMENT '删除的项目id', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '项目整合临时表'; -- 插入数据 超级前台数据整合部分 INSERT INTO `tb_sync_org` (`reverse_id`, `del_id`) VALUES (55, 511), (101, 116), (171, 412), (38, 39), (38, 397), (336, 475), (103, 351), (107, 349), (36, 42), (114, 348), (363, 391), (498, 534), (394, 500); -- 正式数据库插入该数据;测试数据库注释掉; -- 插入数据 超级前台--服务之窗数据整合部分 -- INSERT INTO `tb_sync_org` (`reverse_id`, `del_id`) -- VALUES -- (616, 11), -- (619, 362), -- (626, 6), -- (633, 288), -- (641, 421), -- (646, 390), -- (647, 370), -- (650, 195); -- 新建存储过程:循环整合项目数据 -- 声明结束标识符为 $$ delimiter $$ -- 新建存储过程 DROP PROCEDURE IF EXISTS begin_sync_org; CREATE PROCEDURE begin_sync_org() BEGIN -- 定义变量接收游标中保存的项目id DECLARE reserve_id INT; -- 定义变量接收游标中删除的项目id DECLARE del_id INT; -- 声明循环结束标识符 DECLARE done int DEFAULT FALSE; -- 定义游标 DECLARE cur CURSOR FOR SELECT t1.reverse_id,t1.del_id FROM tb_sync_org t1; -- 指定游标循环结束时的标识 done改为true DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; -- 打开游标 OPEN cur; -- 开始循环 REPEAT FETCH cur INTO reserve_id,del_id; if not done THEN -- 需要执行的操作 CALL sync_org(reserve_id,del_id); END IF; until done end repeat; -- 关闭游标 CLOSE cur; -- 结束过程 END $$ -- 声明结束标识符为 ; delimiter ; -- 调用存储过程进行同步 -- CALL begin_sync_org(); -- 删除临时表 -- DROP TABLE IF EXISTS `tb_sync_org`; -- 删除被合并的项目 -- 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); -- 删除存储过程 -- drop procedure if exists begin_sync_org; -- drop procedure if exists sync_org;