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)
我理解为什么会这样,但是如何以插入有效条目的方式执行命令,并且会丢弃创建错误的命令?
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.如果是这样,跳过错误绝对是错误的方法.看到:
......这是一个备受争议的问题.
| 归档时间: |
|
| 查看次数: |
1552 次 |
| 最近记录: |