0

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

所以,这是一个大麻烦。

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

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

我的问题。

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

最后注释:

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

1 回答 1

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;
于 2013-10-08T15:56:14.287 回答