检查约束

检查约束是一种规则,用于指定基础表每一行的某一列或若干列中允许的值。 例如,您可以定义一个检查约束,确保包含年龄的列中的所有值都是正数。

检查约束指定了基础表特定列可以包含的值,为您提供了一种控制输入到表中的数据的完整性。 您可以使用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 ,则检查约束将添加到表描述中,但会推迟执行。 因为表中可能存在违反检查约束的行,所以该表处于检查待定状态。