设计外键(引用)约束

引用完整性是通过将外键(或引用)约束添加至表定义和列定义并对所有外键列创建索引而强加的。 一旦定义了索引和外键约束,就会针对定义的约束检查对表和列中数据的更改。 请求操作的完成取决于约束检查的结果。

关于本任务

引用约束 是使用 CREATE TABLE 或 ALTER TABLE 语句中的 FOREIGN KEY 子句和 REFERENCES 子句 建立的。 创建引用约束之前,应考虑引用约束对类型表以及对作为类型表的父表的影响。

外键的标识在一个表的行内或两个表的行之间的值上施加约束。 数据库管理器检查表定义中指定的约束,并相应地维持关系。 目标是在不降低性能的条件下,无论何时一个数据库对象引用另一个数据库对象都要维持完整性。

例如,主键和外键各有一个部门号列。 对于 EMPLOYEE 表,该列名为 WORKDEPT,而对于 DEPARTMENT 表,该列名为 DEPTNO。 这两个表之间的关系由下列约束定义:
  • 对于 EMPLOYEE 表中的每个职员只有一个部门号,且该编号存在于 DEPARTMENT表中。
  • EMPLOYEE 表中的每一行都只与 DEPARTMENT 表中的一行相关。 这两个表之间存在唯一的关系。
  • 在 EMPLOYEE 表中具有 WORKDEPT 的非空值的每一行只与 DEPARTMENT 表的 DEPTNO 列中的一行相关。
  • DEPARTMENT 表是父表,而 EMPLOYEE 表是从属表。
定义父表 DEPARTMENT 的语句如下所示:
CREATE TABLE DEPARTMENT
       (DEPTNO    CHAR(3)     NOT NULL,
        DEPTNAME  VARCHAR(29) NOT NULL,
        MGRNO     CHAR(6),
        ADMRDEPT  CHAR(3)     NOT NULL,
        LOCATION  CHAR(16),
           PRIMARY KEY (DEPTNO))
    IN RESOURCE
定义从属表 EMPLOYEE 的语句如下所示:
CREATE TABLE EMPLOYEE
       (EMPNO     CHAR(6)     NOT NULL PRIMARY KEY,
        FIRSTNME  VARCHAR(12) NOT NULL,
        LASTNAME  VARCHAR(15) NOT NULL,
        WORKDEPT  CHAR(3),
        PHONENO   CHAR(4),
        PHOTO     BLOB(10m)   NOT NULL,
           FOREIGN KEY DEPT (WORKDEPT)
           REFERENCES DEPARTMENT ON DELETE NO ACTION)
    IN RESOURCE

通过将 DEPTNO 列指定为 DEPARTMENT 表的主键,而将 WORKDEPT 指定为 EMPLOYEE 表的外键,就对 WORKDEPT 值定义了引用约束。 此约束 实现这两个表的值之间的引用完整性。 在这种情况下,添加至 EMPLOYEE 表的任何职员必须具有一个可以在 DEPARTMENT 表中找到的部门号。

职员表中的引用约束的删除规则为 NO ACTION,这表示如果一个部门中有任何职员,那么不能将该部门从 DEPARTMENT 表中删除。

虽然先前的示例使用 CREATE TABLE 语句来添加引用约束,但是也可以使用 ALTER TABLE 语句。

另一个示例:使用与先前示例所用的相同表定义。 另外,在 EMPLOYEE 表之前 创建 DEPARTMENT 表。 每个部门有一个经理,且该经理在 EMPLOYEE 表中列出。 DEPARTMENT 表的 MGRNO 实际是 EMPLOYEE 表的外键。 因为此引用循环,此约束存在一个小小的问题。 可在以后添加外键。 还可以使用 CREATE SCHEMA 语句来同时创建 EMPLOYEE 和 DEPARTMENT 表。

另请参阅 “参照约束中的外键 ”。