合并两个具有相同模式的 postgress 数据库

dea*_*ode 5 postgresql

我有两个具有相同架构的 Postgresql 数据库,我想将它们合并(或将它们合并到第三个)。

问题是这些表都有 id PK,它们是自动递增主键,并使用这些 id 列作为其他表的 FK。

我知道两个数据库之间的数据在逻辑上是不同的,但它们的 PK 重叠,例如:

数据库A:

表构建: id | name 1 | Smooth Hall 2 | Orchard Towers

桌子地板: id | building_id (FK building.id) | floor_number 1 | 1 | 1 2 | 2 | 1 3 | 2 | 2

数据库B:

表构建: id | name 1 | Chancey Theater 2 | Allen Hall

桌子地板: id | building_id (FK building.id) | floor_number 1 | 1 | 1 2 | 2 | 1 3 | 2 | 2

您是否可以建议使用一种工具或方法来合并这些数据库,以便结果包含所有数据和所有 FK 关系?

我不关心结果行的顺序,也不关心输出中 id 列中的值,只要数据具有相同的逻辑结构和关系即可,例如

数据库C:

表构建: id | name a | Smooth Hall b | Orchard Towers c | Chancey Theater d | Allen Hall

桌子地板: id | building_id (FK building.id) | floor_number e | a | 1 f | b | 1 g | b | 2 h | c | 1 i | d | 1 j | d | 2

其中 aj 是任何不同的数字。

xzi*_*lla 3

不幸的是,没有简单的方法可以做到这一点。本质上,您需要编写一个脚本来遍历其中一个数据库,提取适当的信息,然后将其插入到另一个数据库中,确保管理您获得的新 ID 号并根据需要更新传入信息。模式的复杂性将决定管理的难度,但这是可行的;pg_upgrade 使用此技术的一个版本来处理 Postgres 系统目录内磁盘文件的重新映射。

顺便说一句,这是反对使用代理主键的论点之一。如果您使用完全自然的唯一键,您将能够简单地转储一个数据库并将其加载到另一个数据库中。