导入并覆盖重复行

Import and overwrite duplicate rows

我正在将一些行导入我的 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>
...
\.

(我从答案 中得到了这个纯文本文件的格式)。

当我导入到一个空白数据库时,这个方法工作正常。但是,如果数据库不为空并且在导入过程中发现任何重复行,我会收到错误消息:

ERROR:  duplicate key value violates unique constraint "car_pkey"

有什么方法可以修改我的导入命令以在发现重复项时强制覆盖?换句话说,如果我正在导入一行并且已经有一行具有该 ID,我希望我的新行覆盖它。

您可以导入到临时 table。然后您可以删除在复制新数据之前已经存在的行:

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;

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

您只需为您的汽车和司机添加一个时间字段 table。时间字段是您进行导入的时间。您的主键必须更改 table 作为现有主键和时间字段的二元组。

完成后,您只需删除旧的 table(如果您使用每日方案,那么您将删除前一天)或者在您的查询中使用 max(time_field)