通过存储过程迁移数据:
创建表
CREATE TABLE `test1` (
`idp` varchar(255) DEFAULT NULL,
`brandIdp` varchar(255) DEFAULT NULL,
`namep` varchar(1000) DEFAULT NULL,
`urlp` varchar(1000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=keybcs2;
INSERT INTO `test1` VALUES ('1001', '3004', 'lili', 'www.baidu.com');
INSERT INTO `test1` VALUES ('1002', '3005', 'lucy', 'www.baidu.com');
INSERT INTO `test1` VALUES ('1003', '3004', 'lile', 'www.baidu.com');
CREATE TABLE `test2` (
`idp` varchar(255) DEFAULT NULL,
`brandIdp` varchar(255) DEFAULT NULL,
`namep` varchar(1000) DEFAULT NULL,
`urlp` varchar(1000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=keybcs2;
CREATE TABLE `test3` (
`idp` varchar(255) DEFAULT NULL,
`brandIdp` varchar(255) DEFAULT NULL,
`namep` varchar(1000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=keybcs2;
建立存储过程:
drop PROCEDURE IF EXISTS p;
CREATE PROCEDURE p()
BEGIN
-- 需要定义接收游标数据的变量
DECLARE idp VARCHAR(255);
DECLARE brandIdp VARCHAR(255);
DECLARE namep VARCHAR(1000);
DECLARE urlp VARCHAR(1000);
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT
test1.idp,
test1.brandIdp,
test1.namep,
test1.urlp
from test1;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN cur;
-- 开始循环
read_loop: LOOP
-- 提取游标里的数据
FETCH cur INTO idp,brandIdp,namep,urlp;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
-- 这里做你想做的循环的事件
INSERT INTO test2 VALUES (idp,brandIdp,namep,urlp);
INSERT INTO test3 VALUES (idp,brandIdp,namep);
END LOOP;
-- 关闭游标
CLOSE cur;
END
执行存储过程
call p
使用存储过程,中间遇到了很多坑
CREATE DEFINER=root@localhostPROCEDUREuser_logs`()
begin
– 声明一个标志done, 用来判断游标是否遍历完成
DECLARE done INT DEFAULT FALSE;
– 声明一个变量,用来存放从游标中提取的数据
– 特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL
DECLARE lid varchar(255) DEFAULT NULL;
DECLARE lname varchar(255) DEFAULT NULL;
DECLARE lpid varchar(255) DEFAULT NULL;
DECLARE lzindex varchar(255) DEFAULT NULL;
DECLARE listype varchar(50) DEFAULT NULL;
DECLARE ldescpt varchar(50) DEFAULT null;
DECLARE lcode varchar(50) DEFAULT NULL;
DECLARE licon varchar(50) DEFAULT NULL;
DECLARE lpage varchar(50) DEFAULT NULL;
DECLARE linsert_time varchar(50) DEFAULT NULL;
DECLARE lupdate_time varchar(50) DEFAULT NULL;
– 声明游标对应的 SQL 语句
DECLARE cur CURSOR FOR select id,name, pid,zindex,istype,descpt,code,icon,page,insert_time,update_time from permission;
– 在游标循环到最后会将 done 设置为 TRUE
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
– 执行查询
open cur;
– 遍历游标每一行
read_loop: LOOP
– 提取游标里的数据
FETCH cur INTO lid,lname,lpid,lzindex,listype,ldescpt,lcode,licon,lpage,linsert_time,lupdate_time ;
– 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO permissions(id,name, pid,zindex,istype,descpt,code,icon,page,insert_time,update_time) VALUES( lid,lname,lpid,lzindex,listype,ldescpt,lcode,licon,lpage,linsert_time,lupdate_time);
delete from permission;
END LOOP;
– 关闭游标
CLOSE cur;
end