copy csv postgres忽略违反约束的行

时间:2018-04-20 19:16:48

标签: postgresql csv copy

我有一个包含~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的东西可能

1 个答案:

答案 0 :(得分:4)

通常这样做是这样的:

  • 创建一个临时表,其结构与目标结构相同但没有约束,
  • 使用COPY命令将数据复制到临时表,
  • 使用INSERT命令复制满足从临时表到目标表的约束的行,并根据表contsraint使用WHERE子句中的条件,
  • 删除临时表。

在处理非常大的csv文件或非常有限的服务器资源时,请使用extension file_fdw而不是临时表。它的效率要高得多,但需要服务器访问csv文件(复制到临时表时可以通过网络完成)。