迁移没有主键的表

本页面介绍了如何迁移没有主键的 Oracle 表。

自动主键生成概览

没有主键的表无法保证一致的复制。Database Migration Service 仅迁移具有主键的表。如果源数据库包含没有主键的表,Database Migration Service 可以通过以下方式处理:

  • 当您 转换源代码和架构时,Database Migration Service 可以通过在目标表中添加 ROWID 列来自动创建任何缺失的主键。此自动化流程要求您的源表:
    • 尚无主键。
    • 不要在没有可为 null 的列的情况下使用 UNIQUE 约束条件。
    • 不要创建不含可为 null 的列的 UNIQUE 索引。
    如果您的表不符合这些要求,您需要手动将缺失的主键添加到转换后的 PostgreSQL 架构中的表中。
  • 在旧版转换工作区中,Database Migration Service 不会自动创建主键。如果您使用的是旧版转换工作区,则需要手动将缺失的主键添加到转换后的 PostgreSQL 架构中的表中。

手动添加缺失的主键

如需迁移没有主键的 Oracle 表,请执行以下操作:

  1. 使用转换工作区转换源代码和架构。
  2. 使用 SQL 客户端连接到 Cloud SQL 目标实例。您可以使用以下方法:
    • psql 客户端。您可以使用此方法连接到实例专用 IP,但可能需要创建 Compute Engine 虚拟机。
    • gcloud sql connect 命令。此命令仅适用于启用了公共 IP 地址的 Cloud SQL 实例。
  3. 为表创建缺失的主键约束条件。如需详细了解主键,请参阅 PostgreSQL 文档中的 主键。

    您还可以展开以下部分,查看示例 SQL 命令:

    使用现有列创建主键

    您的表可能已经有一个基于列或列组合的逻辑主键。例如,可能存在配置了唯一性约束条件或索引的列。使用这些列为源数据库中的表生成新的主键。例如:

    ALTER TABLE TABLE_NAME
    ADD PRIMARY KEY (COLUMN_NAME);

    替换以下内容:

    • 将 TABLE_NAME 替换为没有主键的表的名称。
    • COLUMN_NAME 替换为具有唯一性限制条件或索引的列的名称,该列可用作主键。

    使用所有列创建主键

    如果您没有可作为主键的预先存在的限制条件,请使用表的所有列创建主键。请确保您没有超过 PostgreSQL 实例允许的主键长度上限。

    以这种方式创建复合主键时,您需要明确列出要使用的所有列名称。无法使用语句检索所有列名称。例如:

    ALTER TABLE TABLE_NAME
    ADD PRIMARY KEY (COLUMN_NAME_1, COLUMN_NAME_2, COLUMN_NAME_3, ...);

    替换以下内容:

    • 将 TABLE_NAME 替换为没有主键的表的名称。
    • COLUMN_NAME_1、COLUMN_NAME_2 等替换为您要用于创建主键的列的名称。

    使用 ROWID 伪列创建唯一性约束条件

    Oracle 数据库使用 ROWID 伪列来存储表中每一行的位置。如需迁移没有主键的 Oracle 表,您可以在目标 PostgreSQL 数据库中添加 ROWID 列。Database Migration Service 会使用源 Oracle ROWID 伪列中的相应数值填充该列。

    如需添加该列并将其设置为主键,请运行以下命令:

    ALTER TABLE TABLE_NAME ADD COLUMN rowid numeric(33,0) NOT NULL;
    CREATE SEQUENCE TABLE_NAME_rowid_seq INCREMENT BY -1 START WITH -1 OWNED BY TABLE_NAME.rowid;
    ALTER TABLE TABLE_NAME ALTER COLUMN rowid SET DEFAULT nextval('TABLE_NAME_rowid_seq');
    ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_DISPLAY_NAME PRIMARY KEY (rowid);

    替换以下内容:

    • 将 TABLE_NAME 替换为要添加列的表的名称。
    • 将 CONSTRAINT_DISPLAY_NAME 替换为 PRIMARY KEY 限制条件的标识符。

后续步骤