这些示例指示了单列约束格式选项来定义缺省启用的外键约束,并声明禁用的引用约束的名称。
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 表上的约束不用过滤而启用,因为没有指定显式约束方式。可以使用 DISABLED 或 FILTERING 关键字在此示例中指定。SET Database Object Mode 语句的 SET CONSTRAINTS 选项可以重置现有约束的对象方式。
因为以上的 sub_accounts 示例没有为引用约束声明名称,所以数据库服务器在将此约束注册到 sysconstraints 系统目录表中时隐式生成标识符,并将它的方式( E )注册到 sysobjstate 系统目录表中。
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 方式。