使用单列约束格式的示例

这些示例指示了单列约束格式选项来定义缺省启用的外键约束,并声明禁用的引用约束的名称。

缺省启用的引用约束

以下示例使用单列约束格式定义 sub_accountsaccounts 表之间的引用关系。(术语外键约束引用约束是同义词)。sub_accounts 表的 ref_num 列(外键)引用了 accounts 表中的 acc_num 列(外键)。
CREATE TABLE accounts (
          acc_num INTEGER PRIMARY KEY,
          acc_type INTEGER,
          acc_descr CHAR(20));
          CREATE TABLE sub_accounts (
          sub_acc INTEGER PRIMARY KEY,
          ref_num INTEGER REFERENCES accounts (acc_num),
          sub_descr CHAR(20));

以上定义 sub_accounts 表的 CREATE TABLE 语句的单列格式约束语法没有显式指定 ref_num 列是外键,但是REFERENCES 关键字指定 ref_num 必须具有与 accounts 表中 acc_num 列的一些行的值相同的值。这意味着在 sub_accounts 是引用表,accounts 是被引用表的引用关系中,ref_num 列是外键。

在单列约束格式中,您不能显式指定 ref_num 列为外键。当在引用表的单列(或引用同一主键的列列表)上放置引用约束时,要包含 FOREIGN KEY 关键字,您必须代替使用多列约束格式语法来定义引用约束。

缺省情况下,sub_accounts 表上的约束不用过滤而启用,因为没有指定显式约束方式。可以使用 DISABLEDFILTERING 关键字在此示例中指定。SET Database Object Mode 语句的 SET CONSTRAINTS 选项可以重置现有约束的对象方式。

因为以上的 sub_accounts 示例没有为引用约束声明名称,所以数据库服务器在将此约束注册到 sysconstraints 系统目录表中时隐式生成标识符,并将它的方式( E )注册到 sysobjstate 系统目录表中。

禁用的引用约束

以下 CREATE TABLE 引用创建了 xeno_counts 表,并在它的 xeno_num 列和第一个示例中 accounts 表的 acc_num 列之间定义了引用约束。此单列约束格式语法还包含了约束定义,指定 DISABLED 作为它的约束方式,且声明 xeno_constr 作为外键约束的名称。此处 xeno_accounts 是引用表,accounts 是被引用表。
CREATE TABLE xeno_counts (
          xeno_acc INTEGER PRIMARY KEY,
          xeno_num INTEGER REFERENCES accounts (acc_num)
          CONSTRAINT xeno_constr DISABLED,
          xeno_descr CHAR(20));

DISABLED 方式,当 DML 操作在 xeno_counts 表中产生违例行时,不会执行 xeno_constr 约束。然而,要实现参照完整性,可以使 SET Database Object Mode 语句的 SET CONSTRAINTS 选项将约束的方式更改为 ENABLED。或者,START VIOLATION 语句将违例表与 xeno_counts 表关联后, SET CONSTRAINTS 可将 xeno_constr 约束重设为 FILTERING 方式。