导入并覆盖重复行
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)
。
我正在将一些行导入我的 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)
。