合并 postgres 数据

Posted

技术标签:

【中文标题】合并 postgres 数据【英文标题】:Merging postgres data 【发布时间】:2013-10-08 15:22:12 【问题描述】:

我在两个 postgresql 数据库中有数据需要合并为 1。为了清楚起见,两个数据库中都有某个日期的“好”数据需要合并。这不仅仅是将数据从一个附加到另一个。换句话说,假设表 foo 有一个序列号字段。两个数据库都有一个 ID=5555 的 foo 并且两个值都是有效的(但不同)。因此,目标数据库的 foo 保持 5555,新记录应该添加一个新 ID 为 nextval(foo_id_seq)。

所以,这真是一团糟。

我的想法是在目标数据库中创建一个 tmp 模式并从源数据库复制所需的数据。然后我需要基本上“更新”数据。插入新记录的新想法(并更新外键)​​,并更新两个数据库中存在的记录。

我不相信有什么工具可以帮助我解决这个问题。

我的问题。

如何最好地处理生成新 ID?我知道我可以通过选择来做到这一点,而只需省略 id 列,但这需要大量的输入并且会很慢。我的想法是为这些表创建一个临时触发器,该触发器将覆盖执行插入时提供的 id。

最后说明:

两个数据库都处于脱机状态。而我是唯一能找到他们的人。 两个数据库具有完全相同的架构 目标数据库是 9.2

【问题讨论】:

【参考方案1】:

尝试使用类似的东西:

INSERT INTO A(id, f1, f2)
SELECT nextval('A_seq'), tmp_A.f1, tmp_A.f2
FROM tmp_A
WHERE tmp_A.id IN (select A.id FROM A);

INSERT INTO A(id, f1, f2)
SELECT tmp_A.id, tmp_A.f1, tmp_A.f2
FROM tmp_A
WHERE tmp_A.id NOT IN (select A.id FROM A);

思路——用一个INSERT .. SELECT ..插入id字段有冲突的数据,另一个INSERT .. SELECT ..插入没有冲突的数据。

或者简单地为每个插入的记录生成新的id

INSERT INTO A(id, f1, f2)
SELECT nextval('A_seq'), tmp_A.f1, tmp_A.f2
FROM tmp_A;

【讨论】:

是的;我知道我可以做选择。但是,有些表有 50 列。我试图避免在剩下的时间里为所有表格输入插入/选择。 @DavidS 您可以使用pg_tablespg_attribute 表动态生成查询。

以上是关于合并 postgres 数据的主要内容,如果未能解决你的问题,请参考以下文章

需要将一个 Postgres 关系数据库合并到另一个;完全相同的架构,外键是问题

Postgres 合并为空 JSONB 数组

Postgres:在递归合并函数中删除 jsonb 键

在 Postgres 中将多列合并为一列

Postgres如何将2个单独的选择查询合并为1个

使用联合查询将 bigquery 表与谷歌云 postgres 表合并