例如有两张表,一张to_test,一张to_copy,现在需要将to_test表中的两个字段值迁移到to_copy表的两个字段中去
表结构:
第一种方法:使用游标逐条迁移
– 创建存储过程:
DROP PROCEDURE IF EXISTS `test2`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `test2`()
BEGIN
DECLARE v1 INT;
DECLARE v2 VARCHAR(255);
DECLARE st INT DEFAULT 0;
DECLARE num INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT val,val2 FROM to_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET st=TRUE;
OPEN cur1;
WHILE st = FALSE DO
FETCH cur1 INTO v1,v2;
-- SELECT 最后一条会执行两次,插入表时需要控制一下是否结束
IF !st THEN
SET num = num +1;
INSERT INTO to_copy VALUES (v1,v2);
END IF;
END WHILE;
CLOSE cur1;
SELECT num;
END
;;
DELIMITER ;
第二种:使用limit进行一次多条迁移
– 存储过程,入参为每次迁移条数
DROP PROCEDURE IF EXISTS `test03`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `test03`(IN `inputNum` int)
BEGIN
-- 总条数
DECLARE totalCount INT DEFAULT 0;
-- 偏移量
DECLARE temp INT DEFAULT 0;
-- 循环次数
DECLARE cycle INT DEFAULT 0;
-- 次数
DECLARE count INT DEFAULT 0;
-- 是否整除,整除为0,不整除为余数
DECLARE isInt INT DEFAULT 0;
-- 获取总条数
SELECT COUNT(*) FROM to_test INTO totalCount;
-- 如果入参(每次数量)小于总数
IF inputNum <= totalCount THEN
SET isInt = totalCount%inputNum;
SET count = totalCount/inputNum;
-- 设定总循环次数
IF isInt != 0 THEN
SET count = count + 1;
END IF;
DELETE FROM to_copy;
WHILE cycle < count DO
INSERT INTO to_copy (copy1,copy2) SELECT val,val2 FROM to_test LIMIT temp,inputNum;
SET temp = temp +inputNum;
SET cycle = cycle + 1;
END WHILE;
-- 如果入参大于总数
ELSE
DELETE FROM to_copy;
INSERT INTO to_copy (copy1,copy2) SELECT val,val2 FROM to_test LIMIT temp,inputNum;
END IF;
END
;;
DELIMITER ;