2013-10-08 92 views
0

我有兩個postgresql數據庫中的數據需要合併到1中。只需要清楚,兩個數據庫中都需要合併某個日期的「好」數據。這不僅僅是將數據從一個附加到另一個。換句話說,假設table foo有一個序列號字段。兩個數據庫都有一個ID = 5555的foo,並且這兩個值都是有效的(但不同)。因此,目標數據庫的foo保持5555,新記錄應該添加一個新的nextval(foo_id_seq)ID。合併postgres數據

所以,這是一個大混亂。

我的想法是在目標數據庫中創建一個tmp模式並從源數據庫複製所需的數據。然後,我需要基本上「插入」數據。新記錄插入新的想法(和外鍵更新)和兩個dbs中存在的記錄得到更新。

我不相信有一個工具可以幫助我。

我的問題。

如何最好地處理生成新的ID?我知道我可以通過選擇做到這一點,只留下id列,但這是很多打字,並會很慢。我的想法是爲這些表創建臨時觸發器,這些觸發器會覆蓋插入時提供的ID。

最後指出:

  • 兩個數據庫處於脫機狀態。而且我是唯一可以找到他們的人。
  • 兩個數據庫有相同的架構
  • 目標數據庫是9.2

回答

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; 
+0

是;我明白我可以做選擇。但是,一些表格有50列。我試圖避免花費其餘時間輸入所有表格的插入/選擇。 –

+0

@DavidS您可以使用['pg_tables'](http://www.postgresql.org/docs/current/static/view-pg-tables.html)和['pg_attribute'](http:// www.postgresql.org/docs/current/static/catalog-pg-attribute.html)表。 –