如何在 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 ...;
我有这个对象:
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 ...;