2013-02-21 66 views
0

我意外地在删除5000个奇数行的实时数据上运行查询。我做了一个备份我这样做之前,以及备份的格式如下:只使用Postgres中的COPY STDIN恢复一些键值?

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" 

有没有办法改变这个查询只插入我删除的行?像“如果存在,忽略”的东西?通常我知道这会影响许多事情,但因为它实际上只是那些需要替换的条目,我认为这样的事情可以起作用,但我不知道它是否存在?

回答

1

最简单的方法可能是创建原始表的副本并将其还原到该副本。 然后从原件中不存在条目的副本中插入原始表格。 例如

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; 
+0

使用'create table copy_table like original_table'可能是一个更好的选择,而不是'as select ...',例如,应保留缺省值,不为空或检查约束。 – 2013-02-21 08:53:18

+0

如果这只是恢复过程的快速和临时表,并且备份副本被认为可靠,那么可以毫无争议地说是不必要的。实际上使用未记录的表格可能会起作用。 – Gavin 2013-02-21 21:17:19

0

不,使用COPY命令不幸这是不可能的。

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