合并postgres数据

时间:2013-10-08 15:22:13

标签: postgresql postgresql-9.2

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

所以,这是一个很大的混乱。

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

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

我的问题。

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

最后说明:

  • 两个数据库都处于脱机状态。而且我是唯一可以接触他们的人。
  • 两个数据库都具有完全相同的架构
  • 目标数据库是9.2

1 个答案:

答案 0 :(得分:0)

尝试使用以下内容:

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;