选择约束方式选项

使用约束方式(ENABLED 、DISABLED 和 FILTERING)选项来控制 INSERT 、DELETE 、MERGE 和 UPDATE 操作中约束的行为。

对于 CREATE TABLE 语句定义的约束,这些是可选的。

方式
作用
DISABLED
不要在 INSERT 、DELETE 和 UPDATE 操作期间强制约束
ENABLED
在 INSERT 、DELETE 和 UPDATE 操作时强制使用约束。如果目标行引起约束违例,则该语句失败。该方式是缺省值。
FILTERING
如果 START VIOLATIONS 语句创建了违例表和诊断表,在 INSERT 、DELETE 和 UPDATE 操作时强制使用约束。如果目标行引起约束违例,则该语句继续进行。数据库服务器将有问题的行写到与目标关联的违例表中,并将诊断信息写到关联的诊断表中。

如果选择过滤方式,则可以指定 WITHOUT ERROR 或 WITH ERROR 选项。以下列表将说明这些 ERROR 选项。

错误选项
作用
WITH ERROR
在 INSERT 、DELETE 和 UPDATE 操作期间,如果违反过滤方式约束将返回违反完整性的错误。
WITHOUT ERROR
在 INSERT 、DELETE 和 UPDATE 操作期间,如果违反过滤方式约束将不返回违反完整性的错误。这是缺省错误选项。
注:
要使 FILTERING WITHOUT ERROR 方式具有这些作用,您还必须使用 START VIOLATIONS TABLE 语句为定义约束的目标表启动违例表和诊断表。您可以发出这些语句
  • 在您设置表的任何约束为过滤方式之前,
  • 或在您将约束设置成过滤方式后,但在任何用户在对表中的行执行 INSERT、DELETE 或 UPDATE 操作之前。

约束方式注册在 sysobjstate 系统目录表中。

外键约束的 NOVALIDATE 方式

以上列出的方式只是 SET Database Object Mode 语句的 SET CONSTRAINTS 选项在其重置现有外键约束方式时可以指定的约束方式的一个子集。它们还是 ALTER TABLE ADD CONSTRAINT 语句在现有表上创建新的外键约束时能指定的约束方式的子集。

ALTER TABLE ADD CONSTRAINT 和 SET CONSTRAINTS 语句可在约束定义中包含 NOVALIDATE 关键字来指定这些额外外键约束方式中的一种方式。其效果是当创建或启用外键约束时,数据库服务器跳过对违例的现有行的检查,从而减少了处理 DDL 语句所需的时间和资源。然而,当语句执行完毕后,每个 NOVALIDATE 方式自动还原成 ENABLED 或 FILTERING 方式。因此,NOVALIDATE 关键字无法阻止随后表的 DML 操作的参照完整性的强制执行,因为 NOVALIDATE 关键字不能持续超越定义它们的 DDL 语句。

由于大多数表在它们创建后都是空表,因此对现有行的参照完整性检查一般不会在建立表时发生,而且 CREATE TABLE 语句不支持 NOVALIDATE 约束方式。然而,在有外键约束的非空表需要被移动到另一个数据库或数据仓库中的上下文中,这些方式是很有效率的。