如何在两个非空mysql数据库之间合并数据,而不导致主键和外键冲突
在数据库结构相同的情况下,如何将数据从一个数据库迁移到另一个非emoty数据库而不产生主键冲突。 这就是我的意思: 数据库A有100个表,每个表使用主键和外键与其他表互连。每个表都包含大量数据 与B一样的数据中存储的数据类型相同,具有主键和外键关系。 这两个数据库完全相同,但存储在其中的数据却不同。 我希望合并这两个数据库,而不会导致主键和外键冲突 数据库是mysql。如何在两个非空mysql数据库之间合并数据,而不导致主键和外键冲突,mysql,database-design,Mysql,Database Design,在数据库结构相同的情况下,如何将数据从一个数据库迁移到另一个非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,还是其他什么?我喜欢您的偏移解决方案的简单性。