首页 > 解决方案 > Postgres Insert as select from table 忽略任何错误

问题描述

我正在尝试使用 insert as select stmt 将临时表中的记录批量加载到表中,并在冲突策略上进行更新。

我想加载尽可能多的记录,目前如果有任何外键违规没有插入记录,一切都会回滚。有没有办法插入有效记录并跳过错误记录。

https://dba.stackexchange.com/a/46477中,我看到了在查询中使用外部表以忽略错误行的策略。我也不想这样做,因为该表上可能有很多外键,这会使我的查询更加复杂和特定于表。我希望它是通用的。

示例用例,如果临时表中有 100 行并且假设行号 5 和 7 导致插入失败,我想插入其余 98 条记录并确定哪两行失败。我想避免逐条插入记录并捕获错误,因为它效率不高。我正在做这整个练习以避免逐行加载表格。

Oracle 提供了一次捕获批量错误的支持。
示例https://stackoverflow.com/a/36430893/8575780 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1422998100346727312

我已经探索了使用复制加载的选项,它不会捕获空约束和其他数据类型错误,但是当发生外键违规时,什么都不会被提交。

我正在寻找更接近 pgloader 在面临错误时所做的事情。 https://pgloader.readthedocs.io/en/latest/pgloader.html#batches-and-retry-behaviour

标签: postgresqlforeign-keysbulk-load

解决方案


推荐阅读