【问题标题】:How to merge two user tables and associated usermeta tables如何合并两个用户表和关联的用户元表
【发布时间】:2017-07-06 06:49:03
【问题描述】:

我有 2 个类似的数据库,都有用户表和用户元表。我需要合并这些表。 所以有2个像这样的用户表

和 2 个这样的用户元表

我想从中生成合并的用户和用户元表

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

现在替换 usermeta 2 表数据中的旧 user_id 值的好方法是什么,以便我可以将它们插入到 usermeta 1 表中以合并它,即我想从 usermeta 2 中获取它

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

【问题讨论】:

    标签: mysql merge


    【解决方案1】:

    您可以JOIN 表usermeta2 和id_lookup 并将user_id 更新为new_id

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

    【讨论】:

      【解决方案2】:

      如果您想使用自动增量功能来获取新 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 表,因为它们不支持外键。

      【讨论】:

        猜你喜欢
        • 2020-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 2015-07-03
        • 2018-09-03
        • 2010-09-25
        相关资源
        最近更新 更多