迁移没有主键的表

本页面介绍了如何迁移没有主键的 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_1COLUMN_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 限制条件的标识符。

后续步骤