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

log*_*han 3 mysql mysql-management

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

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

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

ID Name 
1  Rob
2  San
3 Tulip
Run Code Online (Sandbox Code Playgroud)

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

ID Name  
1  John
2  Michael
3  Natasha
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 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
Run Code Online (Sandbox Code Playgroud)
  • 从每个数据库导出表.

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

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

  • 开锁.


您可以阅读有关auto_increment_increment您可以更改的相关系统变量,因此从这一点开始,这两个数据库会生成不同的自动递增ID(一个奇数ID,另一个奇数).