mysql利用存储过程迁移数据

本次demo利用存储过程迁移数据是在同一个数据库的实例中,网上查找资料说存储过程如果不在同一个数据库实例中 不能使用。如有此方法demo 可告知本人 万分感谢!!!!

本次demo实现同一个数据苦实例中 不同库 实现的数据迁移

代码;

同库不同表:

drop PROCEDURE if EXISTS test_dept;
CREATE PROCEDURE test_dept () 
BEGIN
	DECLARE d_id INT ( 11 ) DEFAULT 0;
	DECLARE d_name VARCHAR ( 64 ) DEFAULT NULL;
	DECLARE d_level VARCHAR ( 64 ) DEFAULT NULL;
	DECLARE flag INT default false;
	
	DECLARE cur_test CURSOR FOR SELECT id,dept_name,dept_level FROM dept;
	DECLARE CONTINUE HANDLER FOR NOT found SET flag = TRUE;
	
	OPEN cur_test;
	read_loop : LOOP
			FETCH cur_test INTO d_id,d_name,d_level;
		IF
			flag THEN
				LEAVE read_loop;
			
		END IF;
		INSERT INTO dept_copy1 ( id, dept_name, dept_level )
		VALUES
			( d_id, d_name, d_level );
		
	END LOOP;
	CLOSE cur_test;
END;

call test_dept();

跨库;
我这里添加了判断 如果存在 则不添加

drop PROCEDURE if EXISTS testData;
create PROCEDURE testData()
begin
DECLARE index_cur int(20) DEFAULT 0;
DECLARE d_id int(20) DEFAULT 0;
DECLARE d_name varchar(64) DEFAULT null;
DECLARE d_level varchar(64) DEFAULT null;
DECLARE data_index int(24) DEFAULT 0;

-- 创建游标
DECLARE cur_dept CURSOR FOR select id,dept_name,dept_level from dept;
-- 创建一个标识位
DECLARE EXIT HANDLER FOR not found set index_cur=1;

open cur_dept;
 while index_cur <> 1 do

-- 获取游标中数据
FETCH cur_dept into d_id,d_name,d_level;

select count(*) into data_index from test_kettle_two.depts where id=d_id and dept_name=d_name and dept_level=d_level;

-- 如果data_index为0 说明目标数据库中不存在这个则添加该条数据
 IF (data_index = 0) THEN
 insert into test_kettle_two.depts(id,dept_name,dept_level)VALUES(d_id,d_name,d_level);
end if;
 -- fetch cur_dept into d_id,d_name,d_level;
 end while;
close cur_dept;
end;

call testData();

遇到的问题:
因为有的数据参数值不同 当运行第一次的是不会出现问题,如果添加数据在此运行 call test()会出现

Duplicate entry '160' for key 'PRIMARY'  -- 这个问题 我这里是因为参数值的判断 导致重复数据

解决方法:
1.IGNORE : 使用IGNORE,如果插入的记录中存在重复值会忽略重复值的该记录行,不影响其他行的插入。

INSERT IGNORE INTO Table_name(..) VALUES(1,1);

2.REPLACE : 使用replace当插入的记录遇到主键或者唯一重复时先删除表中重复的记录行再插入

REPLACE INTO Table_name() VALUES(1,1);

3.*ON DUPLICATE KEY UPDATE *NAME1=VALUES(ID)+1

ON DUPLICATE KEY UPDATE后面使用VALUES指的是插入记录的值,而不使用VALUES指的是表的自身值。其后执行的UPDATE更新的记录是WHERE重复的主键或唯一键的ID

INSERT TO Table_name() VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE NAME1=NAME1+1;

你可能感兴趣的:(#,mysql,mysql,sql,数据库)