复制 csv postgres 忽略违反约束的行

Bee*_*eba 8 csv postgresql copy

我有一个包含约 300,000 行的 .csv 文件,其中一些违反了我在 postgres 数据库中设置的某些约束。有没有办法将我的 .csv 文件复制到数据库中并让 postgres 过滤掉违反约束的行?我不希望这些行显示在数据库中。

如果这是不可能的,有没有其他方法可以解决这个问题?

我现在正在做的是

COPY blocksequences from '/tmp/blocksequences.csv CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

我得到

'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"
Run Code Online (Sandbox Code Playgroud)

错误原因:包含 M049 的列不允许输入该字符串。许多其他行都有这样的违规行为。

我读了一点关于exception when check violation --do nothing我在这里是否走在正确的轨道上?似乎这只是一个 mysql 的事情也许

kli*_*lin 12

通常这是通过这种方式完成的:

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

在处理非常大的 CSV 文件或非常有限的服务器资源时,请使用扩展名 file_fdw而不是临时表。这是更有效的方法,但它需要服务器访问 CSV 文件(而复制到临时表可以通过网络完成)。

Postgres 12 中,您可以WHERECOPY FROM.