使用Postgres中的COPY STDIN仅恢复一些键值?

时间:2013-02-21 08:29:51

标签: postgresql

我不小心对删除了5000多行的实时数据进行了查询。在我这样做之前我做了一个备份,备份是这种格式:

COPY table (id, "position", event) FROM stdin;
529 1   5283
648 1   6473
687 1   6853
\.

问题是,如果我运行它,我得到:

ERROR:  duplicate key value violates unique constraint "table_pkey"

有没有办法改变这个查询只插入我删除的行?类似于"如果存在,忽略"之类的事情?通常我知道这会影响很多事情,但因为它只是那些需要更换的条目,我认为这样的事情可以起作用,但我不知道它是否存在?

2 个答案:

答案 0 :(得分:1)

最简单的方法可能是创建原始表的副本并还原到该表。 然后从原件中没有条目的副本插入原始表。 e.g。

create table copy_table as select * from table where 1=2;
-- change the copy statement
COPY copy_table from stdin;
...

-- Insert to original
INSERT INTO table t1
SELECT ct.*
  FROM copy_table ct
       LEFT JOIN  table t2 ON t2.id = ct.id -- assuming id is primary key
 WHERE t2.id IS NULL;

答案 1 :(得分:0)

不,遗憾的是,使用COPY命令无法做到这一点。

您需要将所有行插入到临时表中,然后使用insert into .. select ... where not exits (...)将暂存表中的错误行复制到真实表中。