约束和唯一索引的模式

您可为约束或为唯一索引指定启用的或禁用的模式。对于 START VIOLATIONS TABLE 语句已将违反表与诊断表相关联的表,您还可使用 FILTERING 关键字来为处理不遵守约束或不遵守唯一索引要求的那些行指定 ERROR 模式。

当您将外键约束的模式更改为 ENABLED 或 FILTERING 时,您可可选地包括 NOVALIDATE 关键字。这会挂起对那些在 SET CONSTRAINTS 语句执行期间违反该约束的行的引用完整性检查。

这是为了更改在 SET CONSTRAINTS 或 SET INDEXES 语句中的约束或唯一索引的数据库对象模式的语法:
约束和唯一索引的模式

用法

如果您在创建约束的 ALTER TABLE 或 CREATE TABLE 语句中未指定模式,则缺省地启用该约束。

类似地,如果您在创建索引的 CREATE INDEX 语句中未指定模式,则缺省地启用该索引。

然而,对于在 SET Database Object Mode 语句中的数据库对象没有缺省的模式。如果您在 SET Database Object Mode 语句的 SET CONSTRAINTS 或 SET INDEXES 选项中未指定模式,则该语句失败并报错 -201,且不更改该约束模式或索引模式。

WITHOUT ERROR 和 WITH ERROR 过滤选项支持 DML 操作,在其中数据库服务器检测新的或修改了的行是否违反索引或目标表上的唯一索引。在过滤模式中,数据库服务器如何处理不符合的行还依赖于这些因素:
  • 违反表和诊断表是否与在其上定义该约束或唯一索引的表相关联。
  • 当前是启用还是禁用到相关联的违反表和诊断表的输入。
要获取更多信息,请参阅 START VIOLATIONS TABLE 语句STOP VIOLATIONS TABLE 语句

更改约束模式和唯一索引模式的示例

下列语句禁用约束 u100_1,以便它仍然注册在系统目录中,但不起作用:
SET CONSTRAINTS u100_1 DISABLED;
        
如果 u100_1 是启用的唯一索引,而不是约束,则下列语句有类似的作用:
SET INDEXES u100_1 DISABLED;
        
下列语句启用引用的约束 u100_1,而不验证每一行的外键关系:
SET CONSTRAINTS u100_2 ENABLED NOVALIDATE;
        
警告:
您可将外键约束的新模式指定为 ENABLED NOVALIDATEFILTERING WITH ERROR NOVALIDATEFILTERING WITHOUT ERROR NOVALIDATE。这样可提升加载操作的性能,例如,如果知道数据集会对在外键约束的作用域之内的每行都有相应的主键的话。然而,避免在后续的 DML 操作中发生数据库冲突是用户的职责。如果您不确信数据行是否符合,则
  • 您应禁用外键约束,
  • 将数据加载到新的数据库内,
  • 然后在它的表已成功地加载了之后再启用外键约束,以便于数据库服务器可验证数据的引用完整性。
当 SET CONSTRAINTS 语句执行完成时,数据库服务器自动地删除 NOVALIDATE 属性。下列语句启用相同的外键约束并恢复该约束的自动验证:
SET CONSTRAINTS u100_2 ENABLE;
        

当您使用 FILTERING WITHOUT ERROR 关键字来定义过滤模式时,后续的那个约束的违反或那个索引的唯一性违反不会导致 INSERT、DELETE、MERGE 或 UPDATE 操作失败,如果有些行违反该约束或该唯一索引的话。在此过滤模式中,DML 语句成功,但数据库服务器通过将不符合的行写到违反表来强制满足该约束或该唯一索引的要求。

下列语句指导数据库服务器将违反 r104_11 约束的任何行写到违反表,假如违反表与该目标表相关联的话。
SET CONSTRAINTS r104_11 FILTERING WITHOUT ERROR;
        
要获取关于过滤模式的更多信息,请参阅主题 过滤模式
下列语句启用在 orders 表上定义的所有约束:
SET CONSTRAINTS FOR orders DISABLED;
        
那个表上的后续的 DML 操作不理会违反 orders 表上的约束的那些行,不在它的违反表或诊断表中创建条目,如果这些表存在的话。然而,如果在 orders 表上存在任何唯一索引,则根据索引的当前模式处理违反唯一性要求的那些行,如罗列在 sysobjstate 系统目录表中的那样。
1 请参阅 过滤模式
2 仅对 FOREIGN KEY 约束有效