如何在2个非空mysql数据库之间合并数据而又不引起主键和外键冲突

时间:2019-06-16 09:41:01

标签: mysql database-design

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

数据与B具有相同的数据类型,并具有主键和外键关系。 这两个数据库是相同的,但存储在其中的数据却不同。 我想合并两个数据库而不会引起主键和外键冲突。

数据库是mysql。 有什么可能的解决方案?

2 个答案:

答案 0 :(得分:1)

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

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

假设对您而言,合并后保持完整性至关重要,那么您将需要找到一种使主键唯一的方法,即对于A中的每个给定表,一组主键都没有共同的元素, B对应的表。

如果主键是唯一字符串(GUID),则可能不会出现问题。您可以尝试禁用约束,插入数据,然后再次启用约束。然后验证合并的行数= rows_from_A + rows_from_B。

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

答案 1 :(得分:1)

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

抵消

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

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

通过独特的方式识别行

依赖性:表中的FD。

insert select进入目标数据库的方式是,由于您所使用的功能依赖性,所有记录都将获得正确的外键值。

临时标识符

依赖性:时间

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

示例架构:

  

用户(ID,用户名,电子邮件,密码)

     

个人资料(ID,用户ID,名称,描述,得分)

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

  

用户(ID,用户名,电子邮件,密码,source_id)

     

个人资料(ID,用户ID,名称,描述,得分,源ID)

从第二个数据库迁移users时,insert的方式是将目标数据库中的source_id设置为目标数据库中users.id的值。源数据库。然后,在迁移配置文件时,您也以insert设置为user_id值的方式users.id,其中source_id与源id相匹配。您还可以将profiles.source_id设置为源配置文件记录的id,这样就可以将其他内容与此匹配。

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

真正的交易

最好的解决方案可能是上述方法的组合。