如何在 Postgres 中用 COPY 覆盖唯一行?

how can I overwrite unique rows with COPY, in Postgres?

我有这个对象:

CREATE TABLE IF NOT EXISTS {exchangeName}.{tableName}
(
    instrument     VARCHAR                     NOT NULL,
    ts             TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    interval       VARCHAR                     NOT NULL,
    price          FLOAT8                      NOT NULL,
    UNIQUE (instrument, ts, interval)
);

并且我希望每个(仪器、ts、间隔)组合都有一个唯一的行。

但是,我插入了很多这样的数据(F# 代码):

use writer = connection.BeginBinaryImport($"COPY {exchangeName}.{tableName} (instrument, ts, interval, price) FROM STDIN (FORMAT BINARY)")

for k in kvwap do
    do! writer.StartRowAsync()                                          |> Async.AwaitTask
    do! writer.WriteAsync(k.Instrument.Ticker,  NpgsqlDbType.Varchar)   |> Async.AwaitTask
    do! writer.WriteAsync(k.Timestamp,          NpgsqlDbType.Timestamp) |> Async.AwaitTask
    do! writer.WriteAsync(k.Interval.Text,      NpgsqlDbType.Varchar)   |> Async.AwaitTask
    do! writer.WriteAsync(double k.Price,       NpgsqlDbType.Double)    |> Async.AwaitTask

let! c = writer.CompleteAsync()

我遇到错误:

One or more errors occurred. (23505: duplicate key value violates unique constraint "kvwap_instrument_ts_interval_key")

如何让 COPY 指令覆盖现有行?我无法使用 ON CONFLICT 进行常规插入,行太多而且速度太慢。

不,你不能用 COPY 做到这一点。

但您可以使用 COPY 将数据复制到临时 table 中,然后与

之类的东西合并
INSERT INTO tab
SELECT * FROM temp_tab
ON CONFLICT (...)
DO UPDATE ...;