Skip to main content
ClickPipes for Postgres 可以检测源表中的 schema 变更,并且在某些情况下会自动将这些变更同步到目标端表。下面说明了各类 DDL 操作的处理方式: 请注意,新增列会在某个批次同步结束时才传播,这可能发生在达到同步时间间隔或拉取批次大小之后。有关如何控制同步的更多信息,请参见此处

新增列的默认值

对于新增列,只有能够将默认值安全地转换为 ClickHouse 时,ClickPipes 才会传播该默认值。传播后,ClickHouse 在读取早于新列创建的数据分区片段时会使用该默认值。因此,ClickHouse 中已有的行会显示与 PostgreSQL 为早于 ADD COLUMN 的行使用的相同值;无需完整刷新表。 对于 PostgreSQL,ClickPipes 读取的是 PostgreSQL 为已有行存储的值,而不是该列当前的默认表达式。当默认值为表达式时,这一点尤为重要:例如,now() 等非易变表达式会在添加列时由 PostgreSQL 求值,ClickPipes 传播的是求值结果,而非表达式本身。后续的 SET DEFAULTDROP DEFAULT 操作不会改变现有行使用的默认值,也不会传播到 ClickHouse。 以下值会被传播:
  • 布尔值和有限数值。
  • 文本值,包括 varcharchar、枚举、UUID、JSON/JSONB、hstore、网络地址和日期。
  • 时间戳。带时区的时间戳会归一化为 UTC。
当默认值的表示形式无法安全地移植到 ClickHouse 时,将不会传播该默认值,包括 NULL、非有限数值、bytea、数组、时间间隔、时刻值和几何类型。该列仍会被添加,但对于早于该列创建的数据分区片段,ClickHouse 会使用该类型的常规默认值。如果这些现有行必须包含源默认值,则需要完整刷新表。
最后修改于 2026年8月14日