外键约束(也称为引用约束或引用完整性约束)使您能够定义表间以及表内必需的关系。
例如,典型的外键约束可能规定 EMPLOYEE 表中的每个职员必须 是一个现有部门的成员,该部门在 DEPARTMENT 表中定义。
要建立此关系,应将 EMPLOYEE 表中的部门号定义成外键,并将 DEPARTMENT 表中的部门号定义成主键。

包含父键的表称为引用约束的父表,包含外键的表被认为是该表的从属表。
可以在 CREATE TABLE 语句或 ALTER TABLE 语句中定义引用约束。引用约束由数据库管理器在执行 INSERT、UPDATE、DELETE、ALTER TABLE、MERGE、ADD CONSTRAINT 和 SET INTEGRITY 语句时强制实施。
| 概念 | 术语 |
|---|---|
| 父键 | 引用约束的主键或唯一键。 |
| 父行 | 具有至少一个从属行的行。 |
| 父表 | 包含引用约束的父键的表。表可在任意数目的引用约束中充当父表。在引用约束中充当父表的表还可以是引用约束中的从属表。 |
| 从属表 | 在其定义中包含至少一个引用约束的表。表可在任意数目的引用约束中充当从属表。在引用约束中充当从属表的表还可以是引用约束中的父表。 |
| 派生表 | 作为表 T 的后代的表(如果它是 T 的从属表或是 T 的从属表的后代)。 |
| 从属行 | 具有至少一个父行的行。 |
| 派生行 | 作为行 r 的后代的行(如果它是 r 的从属行或是 r 的从属行的后代)。 |
| 引用循环 | 引用约束的集合,该集合中的每个表都是它自身的后代。 |
| 自引用表 | 在同一引用约束中既充当父表又充当从属表的表。该约束称为自引用约束。 |
| 自引用行 | 一个作为它自己的父代的行。 |
引用约束的目的是保证表关系得到维护并遵循数据输入规则。这意味着只要引用约束有效,数据库管理器就保证对于子表中其外键列中具有非空值的每行,相应父表中都存在一个其父键中具有匹配值的行。
引用约束的插入规则为:外键的非空插入值必须与父表的父键的某些值相匹配。如果组合外键的值的任何组成部分为空,那么该值为空。指定外键时,此规则是隐式的。
引用约束的更新规则是在定义引用约束时指定的。选项有 NO ACTION 和 RESTRICT。在更新父表的某行或从属表的某行时应用更新规则。
如果更新规则为 RESTRICT,并且存在一个或多个从属行,那么父代唯一键的值不能更改。但是,如果更新规则为 NO ACTION,并且更新语句完成时每个子代都有父键,那么父代唯一键可以更新。外键的非空更新值必须等于关系的父表的主键值。
而且,将 NO ACTION 或 RESTRICT 用作引用约束的更新规则将确定何时强制执行约束。更新规则 RESTRICT 将在所有其他约束之前(包括修改 CASCADE 或 SET NULL 之类的规则的引用约束)执行。更新规则 NO ACTION 将在其他引用约束之后强制执行。注意,返回的 SQLSTATE 根据更新规则是 RESTRICT 还是 NO ACTION 而有所不同。
如果是从属行,当指定外键时,NO ACTION 更新规则是隐式的。NO ACTION 意味着更新语句完成时,外键的非空更新值必须与父表的父键的某些值相匹配。
如果组合外键的值的任何组成部分为空,那么该值为空。
引用约束的删除规则是在定义引用约束时指定的。选项有 NO ACTION、RESTRICT、CASCADE 或 SET NULL。仅当外键的某些列允许空值时,才能指定 SET NULL。
如果已标识表或已标识视图的基本表为父代,那么选择要删除的行在删除规则 RESTRICT 的关系中一定不能有任何从属项,并且 DELETE 一定不能级联至在删除规则 RESTRICT 的关系中具有从属的后代行。
涉及针对 P 的删除操作的任何表都被认为是删除连接至 P。因此,如果一个表是 P 的从属项,或是 P 中的删除操作级联至的表的从属项,那么该表删除连接至表 P。
下列限制适用于删除连接关系: