首先用一个情景来解释需要实现的功能:
有两张公司内部机构信息表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'
至此两个表就保持数据一一对映了。