我有一个包含~300,000行的.csv文件,其中一些违反了我在postgres数据库中设置的某些约束。有没有办法将我的.csv文件复制到数据库中并让postgres过滤掉违反约束的行?我不希望这些行显示在数据库中。
如果无法做到这一点,还有其他方法可以解决这个问题吗?
我现在正在做的是
COPY blocksequences from '/tmp/blocksequences.csv CSV HEADER;
我得到了
'ERROR: new row for relation "blocksequences" violates check constraint "blocksequences_partid3_check"
DETAIL: Failing row contains (M001-M049-S186, M001, null, M049, S186).
CONTEXT: COPY blocksequences, line 680: "M001-M049-S186,M001,,M049,S186"
错误原因:不允许包含M049的列输入该字符串。许多其他行都有这样的违规行为。
我在exception when check violation --do nothing
看了一下我在正确的轨道上?好像它只是一个mysql的东西可能
答案 0 :(得分:4)
通常这样做是这样的:
COPY
命令将数据复制到临时表,INSERT
命令复制满足从临时表到目标表的约束的行,并根据表contsraint使用WHERE
子句中的条件,在处理非常大的csv文件或非常有限的服务器资源时,请使用extension file_fdw而不是临时表。它的效率要高得多,但需要服务器访问csv文件(复制到临时表时可以通过网络完成)。