我们有两个 Rails 应用程序实例,每个实例都与自己的数据库通信;我们正在将它们转换为具有单个数据库的单个应用程序。我们已经使需要特定于特定域的部分正常工作;现在我们只需要合并数据库。我们将把数据从一个实例复制到另一个实例的数据库中,并修复 ID,使它们不会重叠。有很多表有很多外键。这样做的好方法是什么,这样外键仍然指向新数据库中的正确行?
如果不清楚,我很乐意用糟糕的 ascii 艺术使事情复杂化。
我们有两个 Rails 应用程序实例,每个实例都与自己的数据库通信;我们正在将它们转换为具有单个数据库的单个应用程序。我们已经使需要特定于特定域的部分正常工作;现在我们只需要合并数据库。我们将把数据从一个实例复制到另一个实例的数据库中,并修复 ID,使它们不会重叠。有很多表有很多外键。这样做的好方法是什么,这样外键仍然指向新数据库中的正确行?
如果不清楚,我很乐意用糟糕的 ascii 艺术使事情复杂化。
大多数关系数据库允许您注释一个外键,以便在指向表中的主键发生更改时受到约束。当发生这种情况时,您可以将外键设置为“自动更新”,使用ON UPDATE CASCADE
. 对两个数据库中的所有外键执行此操作,然后更新两个数据库中的所有主键,所有外键都将自动转换。
如何将每个 id 列(包括外键)更新为其原始值乘以 10,然后为第一个数据库添加 1,为第二个数据库添加 2。
这样 id 1 在 db 1 上变为 11,在 db 2 上变为 12。由于主键和外键都经过相同的更改,因此您不必担心记录之间的关系,只需使用相同的公式进行更新.
所以它会像
在分贝 1 上:
UPDATE user SET id = id * 10 + 1;
UPDATE privilege SET id = id * 10 + 1, user_id = user_id * 10 + 1;
在分贝 2 上:
UPDATE user SET id = id * 10 + 2;
UPDATE privilege SET id = id * 10 + 2, user_id = user_id * 10 + 2;