同库不同表:
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;