如何在两个非空mysql数据库之间合并数据,而不导致主键和外键冲突

如何在两个非空mysql数据库之间合并数据,而不导致主键和外键冲突,mysql,database-design,Mysql,Database Design,在数据库结构相同的情况下,如何将数据从一个数据库迁移到另一个非emoty数据库而不产生主键冲突。 这就是我的意思: 数据库A有100个表,每个表使用主键和外键与其他表互连。每个表都包含大量数据 与B一样的数据中存储的数据类型相同,具有主键和外键关系。 这两个数据库完全相同,但存储在其中的数据却不同。 我希望合并这两个数据库,而不会导致主键和外键冲突 数据库是mysql。 可能的解决办法是什么 外键约束是保持数据一致性和完整性的一种手段 当然,您可以禁用约束检查并插入每个表的所有数据,但这会破坏一

在数据库结构相同的情况下,如何将数据从一个数据库迁移到另一个非emoty数据库而不产生主键冲突。 这就是我的意思: 数据库A有100个表,每个表使用主键和外键与其他表互连。每个表都包含大量数据

与B一样的数据中存储的数据类型相同,具有主键和外键关系。 这两个数据库完全相同,但存储在其中的数据却不同。 我希望合并这两个数据库,而不会导致主键和外键冲突

数据库是mysql。
可能的解决办法是什么

外键约束是保持数据一致性和完整性的一种手段

当然,您可以禁用约束检查并插入每个表的所有数据,但这会破坏一致性,因为您将有重复的键,并且无法跟踪引用

假设在合并后保持这种完整性对您来说很重要,您需要找到一种方法使主键唯一,即对于一组主键中的每个给定表,a组主键与B中的对应表没有公共元素

如果主键是唯一字符串(GUID),那么这可能不是问题。您可以尝试禁用约束、插入数据,然后再次启用约束。然后验证合并的行数=来自_A的行数+来自_B的行数


如果具有自动递增的整数主键,则可以尝试调整其中一个数据库,使这些键具有不同的范围,并且不会相互冲突。例如,如果数据库A中的所有键都小于1000000,则可以创建一个新的数据库B2,它是B的副本,但每个主键都要添加1000000。然后可以合并A和B2。

有几种优雅的方法可以解决这个问题

抵消 相关性:自动递增的数字ID

迁移第一个数据库,查看最大id是多少,并在迁移第二个数据库时将其添加到所有主键和外键值中。不是很难,但是如果有很多表,您可能希望生成代码,而不是手工修复。如果您的数据库位于BCNF中,那么这应该是可能的。如果没有,那么您可以将您的模式更改为BCNF并选择此解决方案

通过一些独特的东西来识别行 相关性:表中的FD

将插入
选择
到目标数据库中,这样所有记录都将获得正确的外键值,因为您使用的是函数依赖关系

临时标识符 依赖关系:时间

为每个表创建一个
集群(希望是一个
),并在迁移第二个数据库时将第二个表的ID存储在新的临时列中,并在标识要指向的记录时引用该值

模式示例:

用户(id、用户名、电子邮件、密码)

配置文件(id、用户id、名称、描述、分数)

在目标数据库中,迁移第一个数据库,然后将架构更改为

用户(id、用户名、电子邮件、密码、源id)

配置文件(id、用户id、名称、描述、分数、来源id)

当您从第二个数据库迁移
用户
时,
插入
的方式是将目标数据库中的
源id
设置为源数据库的
用户.id
的值。然后,当您迁移配置文件时,您还可以
插入
,将
user\u id
设置为
users.id
值,其中
source\u id
与源
id
匹配。您还可以将
profiles.source\u id
设置为源配置文件记录的
id
,这样您就可以将其他内容与此记录相匹配

完成迁移后,可以删除临时列

真正的交易
最好的解决方案可能是上述组合。

您有哪种主键?它是自动递增的int-s还是varchar唯一ID,还是其他什么?我喜欢您的偏移解决方案的简单性。