我们如何合并两个具有相同模式的数据库?

发布于 2024-10-11 13:48:11 字数 219 浏览 2 评论 0原文

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

如果这还不清楚,我很乐意用糟糕的 ASCII 艺术让事情变得复杂。

We have two instances of a rails application which each talk to their own database; we're in the process of converting them to a single application with a single database. We've already made the parts of it which need to be specific to a particular domain work correctly; now we just need to merge the databases. We're going to copy the data from one instance into the other's database, and fix up the IDs so they don't overlap. There are a lot of tables with a lot of foreign keys. What's a good way of doing this, such that the foreign keys still point to the correct row in the new database?

If this is unclear, I'm happy to complicate matters with bad ascii art.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

荭秂 2024-10-18 13:48:11

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

Most relational databases let you annotate a foreign key to be constrained to watch for when the primary key in the pointed-to table changes. You can set the foreign key to be "auto-updated" when this happens using ON UPDATE CASCADE. Do this for all foreign keys in both databases, then update all primary keys in both databases, and all foreign keys will be automatically converted.

坠似风落 2024-10-18 13:48:11

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

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

所以它会像

On db 1:

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

On db 2:

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

How about updating every id column (including the foreign keys) to be its original value times 10, then add 1 for the first database and 2 for the second database.

That way id 1 becomes 11 on db 1 and 12 on db 2. Since both the primary and foreign keys go through the same change, you don't have to worry about how the records relate, you just make the updates with the same formula.

So it would go something like

On db 1:

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

On db 2:

UPDATE user SET id = id * 10 + 2;
UPDATE privilege SET id = id * 10 + 2, user_id = user_id * 10 + 2;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文