日期:2014-05-16  浏览次数:20768 次

大家好,我想问一个关于游标遍历插入新表出现主键重复的问题
已经有表tablea:a(主键) b c,有另外一张原始表tableb: d(主键)e f

d e f a b c
1 2 3 null null null
1 2 3
1 2 3

我的sql如下
SQL code

begin
declare v_a text;
declare v_b text;
declare v_c text;
declare done int;
declare cursor for select * from table;
declare continue handler for sqlstate '02000' set done = 1;
open cursor ;
repeat
fetch cursor into v_a,v_b,v_c;
insert tablea (a,b,c) values (v_a,v_b,v_c);
until done end repeat;
close cursor;
end 




------解决方案--------------------
begin
declare v_a text;
declare v_b text;
declare v_c text;
declare done int;
declare cursor for select * from table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cursor ;
fetch cursor into v_a,v_b,v_c;
 WHILE done=0 DO
insert tablea (a,b,c) values (v_a,v_b,v_c);
fetch cursor into v_a,v_b,v_c;
END WHILE;
close cursor;
end 

------解决方案--------------------
你的repeat先insert,再判断,当最后一条后not found,进入continue handler set done=1,然后再进入repeat,insert的时候就报主键冲突了,并且是最大的id 3,而后面的while是先判断,再insert,所有没有问题