数据库迁移:自增外键问题

6
我正在试图将老的MySQL数据库中的一些数据简单迁移到新的MySQL数据库。我正在迁移的数据来自论坛,因此有两个表:threadsposts。直到遇到一些棘手的自增外键关系之前,我的工作一切都很顺利。 数据库架构(只选择重要部分进行简化):
threads (id, title, user_id, created_at, updated_at)
posts (id, thread_id, user_id, body, created_at, updated_at)

如您所见,thread_id 是对应于帖子所属主题的 id 的外键。问题在于:新数据库中已经存在了线程和帖子,并且主键是自动递增的。很容易看出问题所在:两个数据集中的线程和帖子 ID 不会匹配/会相互冲突!如果我只填充帖子表,它们现在将对应于错误的线程等。
我如何解决这个问题,将旧数据集中的线程/帖子插入到新数据集中,而不会弄乱id和相关性?我考虑的方法有:
  • 将旧线程/帖子 ID 加上一个大数,使其不会与新 ID 冲突
  • 放弃并离开,认为这是不可能的
有没有我忽略的简单方法来解决这个问题?“添加大数”方法对我来说似乎不理想。数据库专家,请应用!解决方案将是将旧数据添加到新数据库中,并且所有帖子仍然属于正确的线程。

如果旧数据库是一致的,那么导入后肯定也会保持一致吧?自增字段只有在未提供或为零时才会计算。或者你必须将旧数据库合并到一个具有冲突 ID 的新数据库中吗? - Paul Dixon
我必须将旧数据库与新数据库合并,但它们的id会冲突,这是个问题。例如,在旧数据库和新数据库中都有一个id=1的线程,但它们是不同的,并且有不同的帖子。此外,由于已删除了一些线程,因此存在缺失的数字,因此,如果我只是简单地将它们放入并允许自动递增工作,它们仍然无法匹配,我认为?我可能错了,这让我感到头痛。 - wnajar
我也在努力保留正确的帖子->主题关系。即确保每个主题仍然拥有属于它的正确帖子。 - wnajar
1个回答

6
  • 查找新数据库MAX中的最大线程ID
  • 复制旧数据库
  • 在旧数据库的副本中,执行UPDATE threads SET id=id+MAXUPDATE posts SET thread_id=thread_id+MAX;
  • 将这些已重新映射的线程和帖子导入新数据库 - 在导入帖子时,使用0作为ID以获得新的帖子ID。

是的,这就是我现在正在做的事情...将“添加一个大于新数据库中最大ID的数字”添加到旧数据库中,然后再添加。我们会看看会发生什么... - wnajar
1
我一直在努力尝试解释相同的事情,但方式非常困难:D。 @保罗,感谢你的帮助。 - zur4ik
1
这可能需要我尝试几次才能完全做对,但我同意这是正确/最佳的流程。谢谢。 - wnajar
1
对于任何也在做这件事的人,当你将线程ID增加MAX时,必须删除auto_increment - wnajar
谢谢你的建议,伙计 :) - reignsly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接