SQL语句实现主从表数据同步,记录一一对映

首先用一个情景来解释需要实现的功能:

        有两张公司内部机构信息表A与B,A是总公司使用的,B表是其中一家分公司的自建系统中使用的。

        已知公司内部的机构信息的增删改操作,都是在A表中维护的。B表中不做相关的操作,但是B表中增加了一些自有的字段,且字段名不对映,两表结构差异较大。

        现在该分公司需要定期使用总公司提供的A表来更新B表中的信息,保证两个表中现存的机构一一对应。

 一句话简单来说:

保证A表中有100个机构,B表中也有且仅有这100个机构

那么当这两张表都在同一MySQL服务下时,解决思路如下:

1.将A表逻辑删除的信息,B表如果有且未逻辑删除,则逻辑删除掉

update A.organ aa, B.organ bb 
    set bb.organ_operate = 'd' 
where 
    aa.organ_id = bb.organ_id 
    and aa.organ_operate = 'd' 
    and bb.organ_operate != 'd'

注1:organ为A、B表的表名;

注2:aa.organ_id = bb.organ_id为A、B表关联的外键;

注3:organ_operate为逻辑删除字段,值为d时,代表逻辑删除。值为u时,代表正常。

下例同,不再说明。

2.将A表正常的信息,B表如果已逻辑删除,则恢复

update A.organ aa, B.organ bb 
    set bb.organ_operate = 'u' 
where 
    aa.organ_id = bb.organ_id 
    and aa.organ_operate != 'd' 
    and bb.organ_operate = 'd'

 若需要比对其他信息是否需要更新,使用如下sql:

update A.organ aa, B.organ bb 
    set bb.organ_operate = 'u',  
    bb.organ_name = aa.organ_name
where 
    aa.organ_id = bb.organ_id 
    and aa.organ_operate != 'd' 
    and (bb.organ_operate = 'd' or bb.organ_name != aa.organ_name)

3.将A表没有的信息,B表如果有,则逻辑删除掉

update B.organ bb 
    set bb.organ_operate = 'd'
WHERE
     (
	    SELECT count(1) AS num FROM A.organ aa 
        WHERE 
            aa.organ_id = bb.organ_id
     ) = 0

4.将A表正常的信息,B表没有,则新增进入

insert into organ 
    (organ_id, organ_operate) 
SELECT aa.organ_id, 'u' FROM A.organ aa 
WHERE 
    (
        SELECT count(1) AS num FROM B.organ bb 
        WHERE 
            aa.organ_id = bb.organ_id 
    ) = 0 
    and aa.organ_operate != 'd'

至此两个表就保持数据一一对映了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值