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