关于复制具有引用完整性的表 - Teradata Data Mover

Teradata® Data Mover 用户指南

Product
Teradata Data Mover
Release Number
17.11
Published
2021 年 10 月
Language
中文 (简体)
Last Update
2021-11-08
dita:mapPath
zh-CN/cai1626458602965.ditamap
dita:ditavalPath
zh-CN/mpm1591127278842.ditaval
dita:id
B035-4101
Product Category
Analytical Ecosystem

在大多数情况下,您可以使用 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 尝试复制具有循环引用的源表时,如果目标系统中不存在该表,将会发生错误。