我的应用程序部署在两个不同的区域,例如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
答案 0 :(得分:8)
对于两个原始数据库中的每一个(例如db0
和db1
):
备份数据库。
锁定数据库仅供此脚本使用。
对于数据库中没有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
的列扩展目标数据库,并编辑此表的主键设置。使用包含两列ID
和regionID
的主键。然后从这两个表中导入数据:
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语句即可将regionID
和ID
组合为关键字。
答案 3 :(得分:0)
删除主要密钥并关闭目标数据库表的id字段的自动增量。
然后首先从两个数据库导入数据。
从目标表中删除id列。
再次创建ID列,使该列auto increament
primary key
。