0

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"

削除した行のみを挿入するようにこのクエリを変更する方法はありますか?「存在する場合は無視する」ようなものですか?通常、これは多くのことに影響することを知っていますが、文字通り置き換える必要があるのはこれらのエントリだけなので、このようなものは機能すると思いますが、存在するかどうかはわかりませんか?

4

2 に答える 2

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;
于 2013-02-21T08:50:07.500 に答える
0

いいえ、残念ながらCOPYコマンドを使用することはできません。

すべての行をステージングテーブルに挿入してから、を使用insert into .. select ... where not exits (...)して欠落している行をステージングテーブルから実際のテーブルにコピーする必要があります。

于 2013-02-21T08:50:11.307 に答える