mysql存储过程迁移数据

本文介绍如何使用SQL存储过程实现同库不同表及跨库的数据同步操作,并提供了具体的实现代码示例。针对数据同步过程中可能遇到的重复数据问题,提出了三种解决方案:使用IGNORE跳过重复记录、使用REPLACE替换重复记录以及使用ON DUPLICATE KEY UPDATE更新重复记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


同库不同表:

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;


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值