本页面介绍了如何迁移没有主键的 Oracle 表。
自动主键生成概览
没有主键的表无法保证一致的复制。Database Migration Service 仅迁移具有主键的表。如果源数据库包含没有主键的表,Database Migration Service 可以通过以下方式处理:
- 当您
转换源代码和架构时,Database Migration Service 可以通过在目标表中添加
ROWID列来自动创建任何缺失的主键。此自动化流程要求您的源表:- 尚无主键。
- 不要在没有可为 null 的列的情况下使用
UNIQUE约束条件。 - 不要创建不含可为 null 的列的
UNIQUE索引。
- 在旧版转换工作区中,Database Migration Service 不会自动创建主键。如果您使用的是旧版转换工作区,则需要手动将缺失的主键添加到转换后的 PostgreSQL 架构中的表中。
手动添加缺失的主键
如需迁移没有主键的 Oracle 表,请执行以下操作:
- 使用转换工作区转换源代码和架构。
- 使用 SQL 客户端连接到 Cloud SQL 目标实例。您可以使用以下方法:
-
psql客户端。您可以使用此方法连接到实例专用 IP,但可能需要创建 Compute Engine 虚拟机。 -
gcloud sql connect命令。此命令仅适用于启用了公共 IP 地址的 Cloud SQL 实例。
-
- 为表创建缺失的主键约束条件。如需详细了解主键,请参阅 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 会使用源 OracleROWID伪列中的相应数值填充该列。如需添加该列并将其设置为主键,请运行以下命令:
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限制条件的标识符。