合并 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_tables
和pg_attribute
表动态生成查询。以上是关于合并 postgres 数据的主要内容,如果未能解决你的问题,请参考以下文章