“检查和再次检查” - 表检查约束
表检查约束(table check constraint)对将要添加到表中的数据实施已定义的限制。例如,一个表检查约束可确保每当在 EMPLOYEE 表中添加或更新电话分机时,雇员的电话分机号码都正好为四位数字。可在 CREATE TABLE 语句中使用 CHECK 子句( 图 1和 图 2)或者在如下的 altER TABLE 语句中定义表检查约束。
清单 6. 创建表检查约束。PHONENO_LENGTH 约束确保向 EMPLOYEE 表添加的电话分机正好为四位数字。
db2 alter table employee add constraint phoneno_length check (length(rtrim(phoneno)) = 4)
您也可以使用 DB2 Control Center 来定义表检查约束(图 6)。
图 6. Alter Table 窗口提供了一个方便方式来定义一列上的表检查约束。单击 Add 按钮以定义新约束(将打开 Add Check Constraint 窗口),或者单击 Change 按钮以修改在列表中选中的现有的约束( 图 7)。
图 7. Change Check Constraint 窗口让您修改现有的检查条件。如果表中的现有行包含违反新约束的值,您就不能创建此表检查约束(图 8)。在适当更新了那些不兼容的值之后,您就可以成功添加或修改此约束了。
图 8. 如果新的表检查约束与表中现有的值不兼容,则会返回一条错误。延迟数据检查
SET INTEGRITY 语句可用于将表置于检查暂挂状态。这就允许进行定义新的检查约束的 altER TABLE 语句的执行,而不需检查该表中的现有数据。
使用 SET INTEGRITY 语句可以打开或者关闭表检查约束。这将非常有用,例如,当在给表加载大型数据的期间优化性能时。清单 7 呈现了一个简单场景,展示了使用 SET INTEGRITY 语句的一种可能方式。本例中,将雇员“000100”的电话分机更新为 123,然后关闭 EMPLOYEE 表的完整性检查。在 EMPLOYEE 表上定义要求电话分机值为 4 位数字的检查约束。创建名为 EMPL_EXCEPT 的异常表;这个新表的定义是 EMPLOYEE 表的镜像。然后打开完整性检查,而违反检查约束的行将被写入异常表中。对这些表的查询将证实有问题的行现在仅存在于异常表中。
清单 7. 使用 SET INTEGRITY 语句来延迟约束的检查。
db2 update employee set phoneno = '123' where empno = '000100' db2 set integrity for employee off db2 alter table employee add constraint phoneno_length check (length(rtrim(phoneno)) = 4) db2 create table empl_except like employee db2 set integrity for employee immediate checked for exception in employee use empl_except SQL3602W Check data processing found constraint violations and moved them to exception tables. SQLSTATE=01603 db2 select empno, lastname, workdept, phoneno from empl_except EMPNO LASTNAME WORKDEPT PHONENO ------ --------------- -------- ------- 000100 SPENSER E21 123 1 record(s) selected.
结束语
我们已经探索了 DB2 Universal Database 所支持的不同类型的约束:非空(NOT NULL)约束、惟一约束、主键约束、外键(参照)约束以及表检查约束。我们展示了 DB2 UDB 是如何使用约束来对数据实施业务规则以及帮助维护数据库完整性的。我们还讲解了如何使用命令行和 DB2 Control Center(和如何查询数据库目录)来有效地管理约束。






