为现有表格添加参照约束

您可以使用ALTER TABLE语句为现有表添加参照约束。

准备工作

在加载涉及参照约束或检查约束的表之前,需要创建例外表。 异常表包含CHECK DATA实用程序标识的行,因为它们违反了参照约束或检查约束。

关于本任务

假设示例应用程序中的表格( Db2 示例活动表、项目表、项目活动表、员工表和部门表)已经存在,并具有适当的列定义,且已填充数据。

现在,假设您想通过ALTER TABLE语句添加主键和外部键来定义样本表之间的关系。 以下规则适用于这些关系:
  • 在添加主键之前,现有表的主键列必须具有唯一的索引。 索引成为主索引。
  • 在添加从属表的相应外键之前,必须添加父表的父键。

你可以用几种不同的方法构建相同的参照结构;然而,以下过程可能最容易理解。

过程

为现有表添加参照约束:

  1. 为任何尚未创建主键列索引的表创建一个主键列索引。
  2. 为每个表发布ALTER TABLE语句,添加主键。

    在接下来的步骤中,您将发出ALTER TABLE语句,为每个表添加外键,但活动表除外。 表格空间仍处于“检查中”状态,您可以通过运行带有DELETE(YES)选项的CHECK DATA实用程序来重置表格空间。

    使用“检查数据”工具删除的内容不受删除规则的约束。 删除操作会连带影响被删除行中的所有后代,后果不堪设想。 例如,如果您从部门表中删除部门( A00 )这一行,删除可能会在大部分参照结构中传播。 其余步骤可防止一次从多个表中删除。

  3. 为部门表添加外键,并在其表空间上运行CHECK DATA DELETE(YES)。
    然后,更正异常表中的任何行,并使用INSERT替换部门表中的行。 此表与现有数据一致。
  4. 在部门表中,将外键放在MGRNO上。
    这一步将部门表与员工表之间的关联删除,但不会更改任何表中的数据。
  5. 将外键添加到员工表中,再次运行CHECK DATA实用程序,并更正任何错误。
    如果报告了错误,在更正时,请特别注意不要让任何行与部门表不一致。
  6. 将MGRNO上的外键添加到部门表中,这又使表空间处于CHECK-pending状态。 然后运行“检查数据”实用程序。
    如果您自上次检查后未更改数据,则可以使用DELETE(YES)选项,且删除不会连带其他数据。
  7. 对于以下每个表,按照所示顺序添加其外键,运行带有DELETE(YES)选项的CHECK DATA实用程序,并更正任何有误的行:
    1. PROJECT 表
    2. 项目活动表
    3. 员工到项目活动表

示例

开始通用编程接口信息。
  1. 创建DEPT表,并在DEPTNO列上定义主键。 CREATE TABLE语句中的PRIMARY KEY子句定义了主键。
    CREATE TABLE DEPT
      ⋮
      PRIMARY KEY (DEPTNO);         
  2. 创建 EMP 表,将主键定义为 EMPNO,将外键定义为 DEPT。 CREATE TABLE语句中的FOREIGN KEY子句定义了外键。
    CREATE TABLE EMP
      ⋮
      PRIMARY KEY (EMPNO)           
      FOREIGN KEY (DEPT)
        REFERENCES DEPT (DEPTNO)
        ON DELETE SET NULL;
  3. 修改DEPT表,添加外键MGRNO的定义。
    ALTER TABLE DEPT
      FOREIGN KEY (MGRNO)
        REFERENCES EMP (EMPNO)
        ON DELETE RESTRICT;
通用编程接口信息结束。