如果您想使用自动增量功能来获取新 id(通过插入不带 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,它只是没有 userid 的 metaid,因此 select id, old_id from newmeta 就足够了。 p>
left join 仅在您有损坏数据的情况下使用(例如,没有用户的元数据)。如果您确定所有父母都存在,您可以使用普通的join(但它会默默地忽略没有父母的任何元数据)。
不过,事情可能会变得复杂得多。考虑例如重复。您可能在 email 上有一个唯一索引以防止重复。如果您在两个表中都有一个具有该电子邮件的用户,则不能再通过获取新的主键来简单地合并它们,因为它仍然会违反唯一约束。但您也不能简单地忽略其中一个,因为他们可能是不同的用户(例如共享电子邮件的朋友或家人)或具有不同的详细信息(例如订单历史记录或因为他们搬家而不同的地址)。处理此类情况并准备数据取决于您。解决这个问题没有通用的收据,实际上有整个行业专门负责清理此类数据。
通过自动增量获取新 ID 的替代方法是,例如当您插入它们时,为每个键添加一个固定值(您必须定义一次或即时计算),例如将+2 添加到您使用userid 的所有位置,并添加+4 在您使用metaid 的所有位置,例如
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;
它会自行更新元表中的user_id。这样做的好处是在合并之前数据库将保持一致。但它不适用于 MyISAM 表,因为它们不支持外键。