> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-revert-104359-revert-104251-parquet-single.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ClickHouse Managed Postgres 迁移常见问题解答

> 有关将数据迁移到 ClickHouse Managed Postgres 的常见问题解答。

export const PrivatePreviewBadge = () => {
  return <div className="privatePreviewBadge">
            <div className="privatePreviewIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path d="M5.33301 6.66667V4.66667V4.66667C5.33301 3.194 6.52701 2 7.99967 2V2C9.47234 2 10.6663 3.194 10.6663 4.66667V4.66667V6.66667" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path d="M8.00033 9.33337V11.3334" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path fillRule="evenodd" clipRule="evenodd" d="M11.333 14H4.66634C3.92967 14 3.33301 13.4033 3.33301 12.6666V7.99996C3.33301 7.26329 3.92967 6.66663 4.66634 6.66663H11.333C12.0697 6.66663 12.6663 7.26329 12.6663 7.99996V12.6666C12.6663 13.4033 12.0697 14 11.333 14Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            {'ClickHouse Cloud 私有预览'}
        </div>;
};

<PrivatePreviewBadge link="https://clickhouse.com/cloud/postgres" galaxyTrack={true} slug="migrations-faq" />

关于 Postgres 复制工作机制的许多问题——包括 `TOAST` 列、replication slot、publication、schema 变更和数据类型映射——都可在 [ClickPipes for Postgres FAQ](/zh/integrations/clickpipes/postgres/faq) 中找到解答。其中的信息同样适用于 ClickHouse Managed Postgres 迁移。

<div id="invalid-enum-value">
  ### 复制期间出现“枚举 输入值无效”错误
</div>

当源 Postgres 中存在目标 ClickHouse Managed Postgres 上没有的 枚举 值时，就会出现此错误。逻辑复制不会自动传播 `ALTER TYPE ... ADD VALUE` 命令，因此，如果在初始 schema 设置完成后，源端新增了 枚举 值，就会导致目标端插入失败。

要解决此问题，请在目标 Postgres 上为该 枚举 类型补上缺失的值：

```sql theme={null}
ALTER TYPE your_enum_type ADD VALUE 'new_value';
```

将 `your_enum_type` 替换为你的枚举类型名称，并将 `'new_value'` 替换为错误消息中缺少的值。

<div id="constraint-violation">
  ### 复制期间出现唯一约束或检查约束冲突错误
</div>

当复制顺序与目标端现有约束冲突时，逻辑复制过程中可能发生约束冲突。

* **唯一约束**：我们以批次 `MERGE`/`UPSERT` 操作应用更改，为每个主键写入最新值。因此，特定键的操作顺序可能与唯一索引预期的顺序不一致。即使 `MERGE` 完成后约束能够满足，事务过程中也可能暂时违反 `UNIQUE` 约束。Postgres 无法像延迟外键检查那样延迟唯一索引检查，因此无法将检查推迟到事务结束时。这不会影响数据一致性：行身份由主键定义，`MERGE` 逻辑也基于同一主键。
* **检查约束**：目标端的检查约束可能比源端更严格，或者批次 `MERGE` 期间的中间状态可能不满足该约束，即使最终状态满足。与唯一约束一样，这不会影响数据一致性，因为 `MERGE` 基于定义行身份的主键。

要解除复制阻塞，请删除目标 Postgres 上导致冲突的约束：

```sql theme={null}
-- Drop a unique constraint
ALTER TABLE your_table DROP CONSTRAINT your_constraint_name;

-- Drop a check constraint
ALTER TABLE your_table DROP CONSTRAINT your_check_constraint_name;
```

您可以根据错误消息中的名称查找约束的详细信息：

```sql theme={null}
SELECT conname, conrelid::regclass, contype
FROM pg_constraint
WHERE conname = 'your_constraint_name';
```

复制完成且源端不再处于活动状态后，在切换期间重新添加约束：

```sql theme={null}
ALTER TABLE your_table ADD CONSTRAINT your_constraint_name UNIQUE (column1, column2);
ALTER TABLE your_table ADD CONSTRAINT your_check_constraint_name CHECK (column1 > 0);
```
