如何合并两个用户表和关联的usermeta表

时间:2017-07-06 06:49:04

标签: mysql merge

我有两个类似的数据库都有user和usermeta表。我需要合并这些表。 所以有2个这样的用户表 enter image description here

和这样的2个usermeta表 enter image description here

我想从中生成合并的user和usermeta表 enter image description here

我能够合并用户表(显然!)只需将用户表2(无ID)中的值插入用户表1,给我新的用户表1和新旧ID之间的查找添加的用户

enter image description here enter image description here

现在替换usermeta 2表数据中的旧user_id值有什么好方法,这样我就可以将它们插入到usermeta 1表中来合并它,即我想从usermeta 2获取它 enter image description here

我可以通过vlookup在Excel / CSV中执行此操作,但有时将数据从SQL转换为Excel / CSV并返回是非常棘手的

2 个答案:

答案 0 :(得分:0)

您可以usermeta2id_lookupuser_id并使用new_id更新UPDATE usermeta2 um2 JOIN id_lookup idl ON um2.user_id = idl.old_id SET um2.user_id = idl.new_id;

list_pgo=character(0)
for (y in allb){ ###concept code a b c 
for (x in cty){ ###country code fr us
tempb <- paste(x,"pgo",y,"_id",sep="") ##variable name should be xpgoy_id
list_pgo<-append(list_pgo,tempb,after=length(list_pgo)) ### result should be something like frpgoa_id uspgoa_id frpgob_id uspgob_id frpgoc_id uspgoc_id   
}
} 

答案 1 :(得分:0)

如果您想使用自动增量功能来获取新ID(通过插入没有ID的数据),您必须将具有旧主键的列添加到新用户表(合并后可以删除)完成)。主键标识一行,如果删除它,您将无法再链接旧的和新的ID。所以请使用例如

insert into newuser (id, email, ..., old_id)
select null, email, ... , id
from user2

您的查找表现已自动可用,只是select id, old_id from newuser。由于你想让MySQL在合并期间决定新的(自动增量)id,你显然无法在合并之前生成查找表。

使用此信息,要插入第二个数据库中的元值,您可以使用例如

insert into newusermeta (id, user_id, ..., old_id)
select null, lookup.id, ... usermeta2.id
from usermeta2
left join (select id, old_id from newuser) as lookup
on lookup.old_id = usermeta2.id

您在问题中使用的形式的元查找表同样是

select newmeta.id, newmeta.user_id, newmeta.old_id, newuser.old_id 
from newmeta 
left join newuser on newmeta.user_id = newuser.id

虽然您实际上并不需要2 userids 。由于您必须替换 metaid ,因此只有 metaid 而没有 userid ,因此select id, old_id from newmeta就足够了。

仅在您有损坏的数据(例如没有用户的元数据)的情况下使用left join。如果您确定所有父母都存在,您可以使用正常的join(但它会默默地忽略没有父母的任何元数据)。

事情可能会变得更加复杂。考虑例如重复。您可能在email上拥有唯一索引以防止重复。如果您的用户在两个表中都有该电子邮件,则不能通过再获取新的主键来合并它们,因为它仍然会违反唯一约束。但是你不能简单地忽略一个,因为他们可以是不同的用户(例如朋友或家人共享电子邮件)或具有不同的细节(例如订单历史或不同的地址,因为他们移动)。由您决定处理此类情况并准备数据。没有解决这个问题的一般收据,实际上整个行业都专门用于清理这些数据。

通过自动增量获得新ID的替代方案将是例如在插入它们时,为每个键添加一个固定值(您必须定义一次或动态计算),例如:将+2添加到使用 userid 的所有位置,并使用 metaid 添加+4,例如

insert into newusermeta (id, user_id, ...)
select id, user_id, ... from usermeta1
union select id+4, user_id+2, ... from usermeta2

在这里你可以在合并之前生成查找表(因为你代替MySQL定义了新的密钥),虽然它们没有多少用途,因为你只需添加一个固定的数字。

或者您可以在合并之前更新数据库2(的副本)中的数据。将on update cascade添加到您正在使用(或现在正在创建)的每个外键。然后只需更新主键,例如

update user2 set id = id + 2 order by id desc;
update usermeta2 set id = id + 4 order by id desc;

它将自动更新metatable中的user_id。这样做的好处是数据库在合并之前将保持一致。但它不适用于 MyISAM -tables,因为它们不支持外键。