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
至此两个表就保持数据一一对映了。
下一篇:
SQL语句四种分类之一(DQL)