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