【问题标题】:How can we merge two databases with identical schemas?我们如何合并两个具有相同模式的数据库?
【发布时间】:2011-06-07 03:12:22
【问题描述】:

我们有两个 Rails 应用程序实例,每个实例都与自己的数据库通信;我们正在将它们转换为具有单个数据库的单个应用程序。我们已经使需要特定于特定域的部分正常工作;现在我们只需要合并数据库。我们将把数据从一个实例复制到另一个实例的数据库中,并修复 ID,使它们不会重叠。有很多表有很多外键。这样做的好方法是什么,这样外键仍然指向新数据库中的正确行?

如果不清楚,我很乐意用糟糕的 ascii 艺术使事情复杂化。

【问题讨论】:

  • +1 只是为了提供糟糕的 ASCII 艺术。 :)
  • -1 不仅提供了糟糕的 ASCII 艺术;)

标签: mysql ruby-on-rails database-migration


【解决方案1】:

大多数关系数据库都允许您对外键进行注释,以便在指向表中的主键发生更改时受到约束以观察。当发生这种情况时,您可以使用ON UPDATE CASCADE 将外键设置为“自动更新”。对两个数据库中的所有外键执行此操作,然后更新两个数据库中的所有主键,所有外键都会自动转换。

【讨论】:

    【解决方案2】:

    如何将每个 id 列(包括外键)更新为其原始值乘以 10,然后为第一个数据库添加 1,为第二个数据库添加 2。

    这样,id 1 在 db 1 上变为 11,在 db 2 上变为 12。由于主键和外键都经历了相同的更改,因此您不必担心记录之间的关系,只需使用相同的公式。

    所以它会像

    在 db 1 上:

    UPDATE user SET id = id * 10 + 1;
    UPDATE privilege SET id = id * 10 + 1, user_id = user_id * 10 + 1;
    

    在 db 2 上:

    UPDATE user SET id = id * 10 + 2;
    UPDATE privilege SET id = id * 10 + 2, user_id = user_id * 10 + 2;
    

    【讨论】:

    • 我们正在考虑这些方面的东西 - 可能是 *2 而不是 *10 - 但是我们如何确定需要更改的列?
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多