导入并覆盖重复的行

时间:2015-05-28 08:00:37

标签: postgresql import duplicates overwrite psql

我将一些行导入我的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,我希望我的新行覆盖它。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

在不断进行批量导入(每天说一次)的情况下,解决此问题的一种方法是使用表分区。

您只需在汽车和驾驶员表中添加一个时间字段即可。时间字段是您执行导入的时间。对于这两个表,您的主键都必须更改为现有主键和时间字段的两个元组。

完成后,您只需删除较旧的表(如果您使用的是每日方案,则可以删除前一天),或者在查询中使用max(time_field)