在大多数情况下,您可以使用 Teradata PT API、Teradata JDBC 和 Teradata DSA 将源上具有引用完整性的表复制到目标。
如果一个表中有外键 (FK) 列引用另一个表中的主键 (PK) 列,则该表具有引用完整性。引用完整性有助于确保 PK 与 FK 列之间的数据完整性和一致性。
使用 CREATE TABLE 语句或 ALTER TABLE 语句时,可以向表中添加引用完整性约束。在 Teradata Database 中,您可以声明标准、批量和软式引用完整性。在以下各类引用完整性的示例中,复合外键列集 (Name, Deptid) 引用父级表 db.employee_PK 中的主键列 (Name, Deptid):
引用完整性 | 示例 | 说明 |
---|---|---|
标准 | FOREIGN KEY ( Name , Deptid ) REFERENCES db.employee_PK ( Name , Deptid )) |
强制在行级别具有引用完整性。 |
批量 | FOREIGN KEY ( Name , Deptid ) REFERENCES WITH CHECK OPTION db.employee_PK ( Name , Deptid )) |
强制整个隐式事务具有引用完整性,在单个语句向表中插入多行数据的情况下非常有用。 |
软式 | FOREIGN KEY ( Name , Deptid ) REFERENCES WITH NO CHECK OPTION db.employee_PK ( Name , Deptid )) |
显式地指示 Teradata Database 通过强制 PK-FK 关系具有引用完整性来避免产生系统开销。 |
以下方案说明 Data Mover 如何复制具有外键的表。
源表 | 目标表 | Data Mover 结果 |
---|---|---|
存在 FK 定义 | 表不存在。 | 将源表复制到具有源系统 FK 定义的目标系统。 |
存在 FK 定义 | 没有 FK 定义。 | 将源表复制到无引用完整性的目标系统,因此目标表没有 FK 定义。 |
为 col1 和 col2 定义了 FK | 为 col3 和 col4 定义了 FK。 | 将源表复制到目标系统,但目标表保留其原始 FK 定义(col3 和 col4 上的 FK)。目标表不使用源表的 FK 定义(col1 和 col2 上的 FK)。 |
复制具有引用完整性的表时,存在以下限制:
- 在以下两种情况下,将父表复制到目标时,若子表未作为作业一部分进行复制,则该父表不能存在于目标上:
状况 示例 错误信息 子表对该表存在硬引用完整性关系。 源表 A 与 B,其中 A 是 B 与 C 的父表。 复制源表 A 和 B 时,发生错误,C 对目标上的 A 存在硬引用,但 C 未被复制。应在仅移动 A 和 C 时创建该作业,因为 B 对 A 存在软引用完整性关系。 目标表 A、B 和 C,其中 A 是 B 和 C 的父表;B 对 A 存在软引用完整性引用;C 对 A 存在硬引用完整性引用。 - 复制子表时,只有当子表已存在于目标数据库中,或者如果父表在目标系统中位于与源系统中相同的数据库内,才可以重命名父表或重新指定父表位置。
- 如果目标系统中不存在目标表,将使用源表定义在目标系统中创建该表。因为 Teradata Database 将主键表示为表定义中的一个唯一索引,所以创建的目标表会具有唯一索引而不是主键。子表可引用具有唯一主索引或二级索引的表。
- 如果某个作业使用 Teradata DSA 复制整个数据库,并且数据库包含具有外键的表,则创建的目标表将不含外键。
- 如果源表和目标表包含不同外键,在复制表后,将保留目标表上的外键。
- 只有当子表已存在于目标数据库中,或其父表在目标系统中位于与源系统中相同的数据库时,才能只复制子表而不复制父表。
- 移动表时,如果父表有一个 GENERATE ALWAYS 标识键,且该键用作某个子表的外键,则只能使用 Teradata DSA 移动这些表。对于这种类型的 RI 表,DSA、TPT 或 JDBC 不支持部分复制。
如果父表 (PT1) 中的主键引用子表 (CT1) 中的外键,同时 CT1 中的主键又引用 PT1 中的外键,我们就称这两个表存在循环引用。也就是说,这两个表之间存在相互 PK-FK 关系。复制具有循环引用的源表时,只有在目标表不具有相互 PF-FK 关系的情况下,Data Mover 才能将源表复制到目标系统;目标表之间不得存在任何循环引用。当 Data Mover 尝试复制具有循环引用的源表时,如果目标系统中不存在该表,将会发生错误。