2015-05-28 29 views
4

我進口一些行到我的Postgres數據庫,像這樣:導入和覆蓋重複的行

psql -U postgres import_test < 1432798324_data 

凡我import_test是我的數據庫和1432798324_data文件只是格式化喜歡純文本:

COPY cars FROM stdin; 
<row data> 
<row data> 
... 
\. 

COPY drivers FROM stdin; 
<row data> 
<row data> 
... 
\. 

(我從答案here得到了這個純文本文件的格式)。

當我輸入空白數據庫時,此方法正常工作。但是,如果數據庫不爲空,並在導入過程中的任何重複的行發現我得到一個錯誤:

ERROR: duplicate key value violates unique constraint "car_pkey" 

有什麼辦法,我可以修改我的輸入命令來強制覆蓋,如果重複被發現?換句話說,如果我正在導入一行,並且已經有一行包含該ID,我希望我的新行覆蓋它。

回答

3

您可以導入臨時表。然後,您可以刪除已經存在的行,然後再複製新數據:

create temporary table import_drivers as select * from drivers limit 0; 

copy import_drivers from stdin; 

begin transaction; 

delete from drivers 
where id in 
     (
     select id 
     from import_drivers 
     ); 

insert into drivers 
select * 
from import_drivers; 

commit transaction; 
+0

所以這段代碼在我的純文本文件中?基本上,我的純文本中每個表都有這樣的代碼塊? – Robert

+0

另外,是否有更有效的方法來做到這一點,因爲這些表中有一些具有數百萬行?這必須插入所有行2次嗎? – Robert