如何在“全代理”数据库之间迁移数据?

Tul*_*ova 3 migration

有一些周期性,这需要完成:

  • 将生产数据库中的数据插入到测试/开发数据库中,以便程序员有新的数据进行测试。
  • 无论出于何种原因,将数据从一个数据库迁移到另一个数据库。

注意:数据库是关系型的。

问题是:

  • 数据库采用“所有 PK 都是代理”策略建模。
  • 将数据从一个数据库移动到另一个数据库涉及编程以避免 PK 值(由序列生成)的冲突。
  • 为了在代理键之间进行“等效”,需要一个将原始数据库表和目标数据库表的 PK 值配对的表。
  • 必须在迁移之前通过匹配业务键(不是 PK,所以不要管理 FK)来创建该表
  • 与具有自然键的表相比,即使是单个表的数据迁移也不是微不足道的。

当所有表都有代理键时,将行从一个数据库复制到另一个数据库的最简单方法是什么?

小智 7

不久前我们在工作中遇到了这个问题(或者至少是类似的问题),我们的解决方案是将迁移过程分为几个步骤:

  • 将新数据插入临时临时表
  • 更新临时表中的代理键,以便没有冲突
  • 将数据插入目标表
  • 删除临时表

第二部分是棘手的部分,但在我们的例子中,我们能够为每个表遵循这个算法:

  • 如果此表有任何外键,请使用 ON UPDATE CASCADE 在临时表中设置外键
  • 将所有行的主键更新为新的 id 范围。我们使用了否定的 ID。例如更新暂存表集 ID=-ID-1; 现在下一步就没有 id 冲突的风险了。
  • 现在,对于 STAGINGTABLE 中的每一行,生成并分配一个新的 id

对每个临时表重复此操作。处理完所有临时表后,将数据插入目标表中。

这依赖的一个假设是所有数据都是新的并且独立于数据库中已有的数据。