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

Mysql 如何合并两个用户表和关联的usermeta表,mysql,merge,Mysql,Merge,我有两个类似的数据库,都有user和usermeta表。我需要合并这些表。 所以有两个类似的用户表 还有两个像这样的usermeta表 我想从中生成合并的user和usermeta表 我能够合并用户表(显然!),只需将用户表2(没有ID)中的值插入到用户表1中,就可以得到新的用户表1以及在添加的用户的新旧ID之间进行查找 现在替换usermeta 2表数据中的旧用户id值的好方法是什么,这样我就可以将它们插入usermeta 1表以合并它,也就是说,我想从usermeta 2获得这个值

我有两个类似的数据库,都有user和usermeta表。我需要合并这些表。 所以有两个类似的用户表

还有两个像这样的usermeta表

我想从中生成合并的user和usermeta表

我能够合并用户表(显然!),只需将用户表2(没有ID)中的值插入到用户表1中,就可以得到新的用户表1以及在添加的用户的新旧ID之间进行查找

现在替换usermeta 2表数据中的旧用户id值的好方法是什么,这样我就可以将它们插入usermeta 1表以合并它,也就是说,我想从usermeta 2获得这个值


我可以通过vlookup在Excel/CSV中完成这项工作,但有时将数据从SQL转换为Excel/CSV并返回是很棘手的

您可以
加入
表格
usermeta2
id\u查找
并使用
新id
更新
用户id

UPDATE usermeta2 um2 JOIN id_lookup idl ON um2.user_id = idl.old_id
SET um2.user_id = idl.new_id;

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

insert into newuser (id, email, ..., old_id)
select null, email, ... , id
from user2
您的查找表现在自动可用,只需
select id,old\u 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个用户ID。由于在任何地方都必须替换metaid,因此只有metaid而没有用户id,因此
select id,newmeta中的old_id
就足够了

左连接
仅在数据损坏时使用(例如,没有用户的元数据)。如果您确定所有父项都存在,则可以使用普通的
联接(但它将在没有父项的情况下默默忽略任何元数据)

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

通过自动增量获取新ID的另一种方法是,在插入时为每个键添加一个固定值(必须定义一次或动态计算),例如,在使用用户ID的任何地方添加
+2
,在使用metaid的任何地方添加
+4
,例如

在这里,您可以在合并之前生成查找表(因为您而不是MySQL定义了新的键),尽管它们没有多大用途,因为您只是添加了一个固定的数字

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

update user2 set id = id + 2 order by id desc;
update usermeta2 set id = id + 4 order by id desc;
它将自己更新元表中的
用户id
。这样做的好处是,在合并数据库之前,它将保持一致。但它不适用于MyISAM表,因为它们不支持外键

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