检查约束
检查约束是一种规则,用于指定基础表每一行的某一列或若干列中允许的值。 例如,您可以定义一个检查约束,确保包含年龄的列中的所有值都是正数。
检查约束指定了基础表特定列可以包含的值,为您提供了一种控制输入到表中的数据的完整性。 您可以使用CREATE TABLE语句创建带有检查约束的表,也可以使用ALTER TABLE语句添加约束。 但是,如果表的完整性受损或无法保证,则包含该表的表空间或分区将处于检查待定状态。 检查完整性是指当表格的每一行都符合该表格定义的检查约束时,检查完整性就存在。
例如,您可能希望确保工资不低于15000美元。 为此,您可以创建以下检查约束:
CREATE TABLE EMPSAL
(ID INTEGER NOT NULL,
SALARY INTEGER CHECK (SALARY >= 15000));使用检查约束可以简化编程任务,因为您无需在应用程序或验证例程中强制执行这些约束。 在创建或修改表时,对表中的一列或多列定义检查约束。
检查约束条件注意事项
检查约束的语法在定义约束时即被检查,但约束的含义不会被检查。 以下示例显示了未发现的错误。 列 C1 定义为整数,非空。
允许但错误的检查约束:
- 一个自相矛盾的检查约束:
CHECK (C1 > 5 AND C1 < 2) - 两个相互矛盾的检查约束:
CHECK (C1 > 5) CHECK (C1 < 2) - 两个检查约束,其中一个多余:
CHECK (C1 > 0) CHECK (C1 >= 1) - 与列定义相矛盾的检查约束:
CHECK (C1 IS NULL) - 重复列定义的检查约束:
CHECK (C1 IS NOT NULL)
检查约束不会与其他类型的约束进行一致性检查。 例如,从属表中的列可以具有参照约束,并带有删除规则SET NULL。 您还可以定义一个检查约束,禁止列中出现空值。 因此,删除父行的尝试会失败,因为将从属行设置为空会违反检查约束。
同样,检查约束不会与验证程序进行一致性检查,验证程序在检查约束之前应用于表格。 如果常规要求某列大于或等于10,而检查约束要求同一列小于10,则无法插入表。 在表格中定义或删除检查约束后,计划和方案无需重新生成。
当检查约束被强制执行时
在表上定义检查约束后,任何更改都必须满足这些约束,如果更改是由:
- LOAD实用程序,带有强制约束选项
- SQL插入操作
- SQL更新操作
对基础表列定义的任何约束都适用于在该基础表上定义的视图。
当您使用ALTER TABLE向已填充的表添加检查约束时,检查约束的执行由CURRENT RULES特殊寄存器的值决定,如下所示:
- 如果值为STD,则检查约束在定义时立即生效。 如果一行不符合要求,则检查约束不会添加到表中,并发生错误。
- 如果值为 Db2 ,则检查约束将添加到表描述中,但会推迟执行。 因为表中可能存在违反检查约束的行,所以该表处于检查待定状态。