2015-05-28 30 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