Hubert 'depesz' Lubaczewski:期待PostgreSQL 17——新增COPY选项SAVE_ERROR_TO / 将COPY选项从SAVE_ERROR_TO重命名为ON_ERROR

💡 原文英文,约500词,阅读约需2分钟。
📝

内容提要

2024年1月16日,Alexander Korotkov提交了一个补丁,添加了新的COPY选项SAVE_ERROR_TO,用于指定保存错误信息的位置。该选项允许跳过软错误并继续复制。未来的工作将添加更多选择。三天后,他又在下一个补丁中更改了语法,将COPY选项从SAVE_ERROR_TO改为ON_ERROR,选项名称现在是stop和ignore。这是最常被请求的五个缺失功能之一。

🔎

延伸解读

功能定位:跳过软错误而非所有错误

新选项ON_ERROR IGNORE仅处理“软错误”,即列值存在但无法转换为目标数据类型的情况。若行本身缺少列值(如缺失字段),COPY仍会报错并中止。因此,它并非万能容错,而是针对数据转换失败的特定场景。

语法演变:从SAVE_ERROR_TO到ON_ERROR

补丁最初引入SAVE_ERROR_TO,仅支持'none',用于指定错误信息保存位置。三天后语法改为ON_ERROR,选项变为'stop'(默认)和'ignore'。这一重命名使语义更直观,并为未来扩展(如保存到文件或表)预留空间。

实际效果:跳过错误行并继续复制

测试中,包含无效整数(如'z')的输入文件在旧版本导致COPY失败。在Pg17中使用(on_error IGNORE)后,COPY成功跳过2行不兼容数据,并复制剩余2行有效数据,同时发出NOTICE提示跳过行数。这验证了该选项的实用性。

未来展望:仍待支持格式错误行

当前实现仅能忽略数据类型转换错误,尚不能处理格式错误的行(如字段数量不对)。作者希望未来COPY能进一步忽略此类错误。作为最常被请求的功能之一,此补丁是重要的第一步,但功能边界仍需明确。

❓

Q&A

PostgreSQL 17 中 COPY 命令新增的 ON_ERROR 选项有什么作用?

ON_ERROR 选项允许在 COPY 过程中跳过软错误(如数据类型转换错误)并继续复制,而不是整个操作失败。它有两个值:'stop'(默认,遇到错误停止)和 'ignore'(跳过错误行并继续)。

PostgreSQL 17 的 COPY 命令中 ON_ERROR 选项支持哪些参数?

ON_ERROR 选项支持两个参数:'stop'(默认)和 'ignore'。'stop' 表示遇到错误时停止复制,'ignore' 表示跳过错误行并继续复制。

为什么 PostgreSQL 要将 COPY 选项从 SAVE_ERROR_TO 重命名为 ON_ERROR?

重命名是为了改进语法,使选项名称更直观。SAVE_ERROR_TO 最初只支持 'none',而重命名为 ON_ERROR 后,选项值变为 'stop' 和 'ignore',更清晰地表达了错误处理行为。

在 PostgreSQL 17 中,使用 COPY ... ON_ERROR IGNORE 时,哪些错误会被忽略?

ON_ERROR IGNORE 会忽略“将列输入值转换为数据类型时”的错误,即数据值存在但无法转换为目标类型的情况。它不会忽略缺失数据或格式错误的行。

如何在 PostgreSQL 17 中测试 COPY 的 ON_ERROR IGNORE 功能?

可以创建一个包含错误数据的文件,例如某些行的第二列不是整数,然后执行 COPY 命令并加上 (on_error ignore) 选项。例如:COPY copytest FROM '/tmp/copy.data' (on_error ignore); 成功后会跳过错误行并复制有效行。

PostgreSQL 17 的 COPY 错误忽略功能未来可能有哪些扩展?

未来可能添加更多选项,例如将错误信息保存到日志文件('file')或表中('table'),以及可能忽略格式错误的行。目前 ON_ERROR 只支持 'stop' 和 'ignore'。

🏷️

标签

➡️

继续阅读