Postgres 生成列:注意事项与最佳实践
在复制包含 PostgreSQL 生成列的表时,有一些重要注意事项需要牢记。这些“坑”可能会影响复制过程以及目标系统中的数据一致性。
生成列的问题
-
不会通过
pgoutput发布: 生成列不会通过pgoutput逻辑复制插件发布。这意味着,当你将数据从 PostgreSQL 复制到另一个系统时,复制流中不会包含生成列的值。 -
主键相关问题: 如果生成列是主键的一部分,它可能会在目标端引发去重问题。由于生成列的值不会被复制,目标系统将缺少正确识别和去重行所需的信息。
-
Schema 变更问题: 如果你在已经进行复制的表上新增一个生成列,该新列在目标端将不会被填充——因为 Postgres 不会为该新列提供
RelationMessage。之后如果你在同一张表上再新增一个非生成列,ClickPipe 在尝试对齐 schema 时,将无法在目标端找到这个生成列,从而导致复制过程失败。
最佳实践
为规避这些限制,请考虑以下最佳实践:
-
在目标端重新创建生成列: 与其依赖复制过程来处理生成列,建议在目标端使用 dbt(Data Build Tool)或其他数据转换机制重新创建这些列。
-
避免在主键中使用生成列: 在设计需要被复制的表时,最好避免将生成列作为主键的一部分。
即将推出的 UI 改进
在即将发布的版本中,我们计划新增一个 UI,帮助用户完成以下操作:
-
识别包含生成列的表: UI 将提供功能,用于识别包含生成列的表,帮助用户了解哪些表受此问题影响。
-
文档和最佳实践: UI 将包含在复制表中使用生成列的最佳实践,包括如何避免常见陷阱的指南。