如何在将一个db与其他db合并时解决主键冲突

时间:2012-01-25 11:19:20

标签: mysql mysql-management

我的应用程序部署在两个不同的区域,例如US-WEST和EU,两个应用程序都有自己的数据库。现在我想把欧盟地区数据库移到US-WEST。

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

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

ID Name 
1  Rob
2  San
3 Tulip

来自DB2的用户表(例如来自EU)具有以下条目

ID Name  
1  John
2  Michael
3  Natasha

4 个答案:

答案 0 :(得分:8)

  • 对于两个原始数据库中的每一个(例如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,另一个奇数)。

答案 1 :(得分:1)

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

insert into destination_table 
    select id + 10000, othercolumns from source_table

导入数据后,您可以再次开启自动增量。

编辑:

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

答案 2 :(得分:1)

我认为您必须使用例如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组合为关键字。

答案 3 :(得分:0)

  1. 删除主要密钥并关闭目标数据库表的id字段的自动增量。

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

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

  4. 再次创建ID列,使该列auto increament primary key