我不小心对删除了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"
有没有办法改变这个查询只插入我删除的行?类似于"如果存在,忽略"之类的事情?通常我知道这会影响很多事情,但因为它只是那些需要更换的条目,我认为这样的事情可以起作用,但我不知道它是否存在?
答案 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 (...)
将暂存表中的错误行复制到真实表中。