【问题标题】:How to resolve primary key collision while merging one db with other如何在将一个数据库与其他数据库合并时解决主键冲突
【发布时间】:2012-01-25 11:19:19
【问题描述】:

我将我的应用程序部署在两个不同的地区,比如美国-西部和欧盟,这两个应用程序都有自己的数据库。现在我想将欧盟区域数据库移动到美国西部。

这将导致主键冲突,因为两个数据库都有具有相同主自动增量 id 的表,任何人都可以给我建议来解决这个问题。

场景: DB1 中的用户表(例如来自 US-WEST)具有以下条目

ID Name 
1  Rob
2  San
3 Tulip

来自 DB2(比如来自欧盟)的用户表具有以下条目

ID Name  
1  John
2  Michael
3  Natasha

【问题讨论】:

  • 您的表中的 id 是否与其他表(外键等)连接?然后您必须考虑更改整个数据库中的 id。

标签: mysql mysql-management


【解决方案1】:
  • 对于两个原始数据库中的每一个(比如db0db1):

    • 备份数据库。

    • 锁定数据库仅供此脚本使用。

    • 对于数据库中所有定义了没有ON UPDATE CASCADE 的外键的表,使用此选项更改所有这些外键约束。

    • 对于每个具有auto_increment(或简单整数)主键的表,运行此命令(级联更新将完成其余部分):

.

           UPDATE TableX
           SET Pk = 2 * Pk - 0         --- for db0
           ORDER BY Pk DESC

           UPDATE TableX
           SET Pk = 2 * Pk - 1         --- for db1
           ORDER BY Pk DESC
  • 从每个数据库中导出表。

  • 现在通过简单地合并相应的表来合并两个数据库。来自db0 的所有数据都将具有偶数ID,而来自db1 的所有数据将具有奇数ID。没有碰撞。

  • 对于没有自动递增主键的表或可能有公共行的表,合并应该是不同的,当然。

  • 解锁。


您可以阅读有关auto_increment_increment 和相关系统变量的信息,您可以从这里更改,因此这两个数据库会生成不同的自动递增 id(一个奇数 id,另一个偶数)。

【讨论】:

    【解决方案2】:

    在您的目标数据库中关闭自动增量。然后首先从 DB1 和 DB2 导入数据。在从 DB2 导入时,添加一个高于第一个 DB 中最高 id 的常量值。像这样:

    insert into destination_table 
        select id + 10000, othercolumns from source_table
    

    导入数据后可以再次开启自增功能。

    编辑:

    如果您的 id 列引用其他表,则此方法将破坏与这些表的关系。

    【讨论】:

    • @juergen_d 请提及,这将破坏 DB2 中用户的所有可能关系
    【解决方案3】:

    我认为您必须使用例如regionID 的列来扩展您的目标数据库,并编辑该表的主键设置。使用包含 IDregionID 两列的主键。然后像这样从两个表中导入数据:

    Insert into destination_table values(regionID, ID, Name)
    select 1,ID, Name from DB1
    
    Insert into destination_table values(regionID, ID, Name)
    select 2,ID, Name from DB2
    

    现在,棘手的部分。您必须对使用ID 作为关系的所有表执行此操作。传输完所有数据后,您只需编辑 SQL 语句以使用 regionIDID 组合作为键。

    【讨论】:

      【解决方案4】:
      1. 从目标数据库表的 id 字段中删除初级键并关闭自动增量。

      2. 然后首先从两个数据库中导入数据。

      3. 从目标表中删除 id 列。

      4. 再次创建 id 列使该列成为auto increamentprimary key

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 2017-12-23
        • 2019-08-08
        • 2022-12-18
        • 1970-01-01
        相关资源
        最近更新 更多