postgresql:\ copy方法输入有效条目并丢弃异常

liv*_*v a 2 sql postgresql commit

输入以下命令时:

\copy mmcompany from '<path>/mmcompany.txt' delimiter ',' csv;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR: duplicate key value violates unique constraint "mmcompany_phonenumber_key"
Run Code Online (Sandbox Code Playgroud)

我理解为什么会这样,但是如何以插入有效条目的方式执行命令,并且会丢弃创建错误的命令?

Cra*_*ger 5

PostgreSQL不这样做的原因与它如何实现约束和验证有关.当约束失败时,它会导致事务中止.交易处于不洁状态,无法恢复.

可以为每一行创建一个新的子事务,但这非常慢,并且首先违背了使用的目的COPY,因此COPY此时PostgreSQL不支持它.您可以在PL/PgSQL中自己创建一个BEGIN ... EXCEPTION块,其中包含LOOP一个从复制到临时表中的数据中选择的块.这工作得相当好,但可能很慢.

如果可能的话,最好在执行任何违反它们的插入之前使用SQL检查约束.这样你就可以:

CREATE TEMPORARY TABLE stagingtable(...);

\copy stagingtable FROM 'somefile.csv'

INSERT INTO realtable
SELECT * FROM stagingtable
WHERE check_constraints_here;
Run Code Online (Sandbox Code Playgroud)

但是请记住并发问题.如果你试图做一个合并/ UPSERT通过COPY必须 LOCK TABLE realtable;在您的交易的开始,或者你仍然有潜在的错误.看起来这就是你想要做的事 - 一个copy if not exists.如果是这样,跳过错误绝对是错误的方法.看到:

......这是一个备受争议的问题.