设计参考约束
在插入或更新记录时由数据库管理器强制执行的约束可能会产生大量系统活动,尤其在装入大量具有引用完整性约束的记录时。 如果在将记录插入到表中之前应用程序已验证信息,那么使用参考约束比使用一般约束的效率要高。
参考约束告知数据库管理器数据遵从哪些规则,但数据库管理器不强制执行这些规则。 但是,此信息可以由 Db2® 优化器使用,并且可以提高 SQL 查询的性能。
CREATE TABLE APPLICANTS
(
AP_NO INT NOT NULL,
GENDER CHAR(1) NOT NULL,
CONSTRAINT GENDEROK
CHECK (GENDER IN ('M', 'F'))
NOT ENFORCED
ENABLE QUERY OPTIMIZATION,
AGE INT NOT NULL,
CONSTRAINT AGEOK
CHECK (AGE BETWEEN 1 AND 80)
NOT ENFORCED
ENABLE QUERY OPTIMIZATION,
);
此示例包含两个选项,它们更改列约束的行为。 第一个选项是 NOT ENFORCED,它在插入或更新数据时指示数据库管理器不要强制检查此列。 可进一步将此选项指定为 TRUSTED 或 NOT TRUSTED。 如果参考约束指定为 TRUSTED,那么数据库管理器可信任数据将符合该约束。 这是缺省选项。 如果指定 NOT TRUSTED,那么数据库管理器知道大部分数据(但不是所有数据)将不符合该约束。 在此示例中,缺省情况下该选项为 NOT ENFORCED TRUSTED,因为未指定该选项可信或不可信。
第二个选项是 ENABLE QUERY OPTIMIZATION,在对此表运行 SELECT 语句时数据库管理器将使用此选项。 指定此值后,数据库管理器将在优化 SQL 时使用约束中的信息。
INSERT INTO APPLICANTS VALUES
(1, 'M', 54),
(2, 'F', 38),
(3, 'M', 21),
(4, 'F', 89),
(5, 'C', 10),
(6, 'S',100),
申请人编号 5 的性别为 (C),它表示小孩,而申请人编号 6 不仅具有不寻常的性别并且超过 AGE 列的年龄限制。 在这两种情况下,数据库管理器允许进行插入操作,因为约束是 NOT ENFORCED 和 TRUSTED。 对该表执行 SELECT 语句的结果如以下示例所示: SELECT * FROM APPLICANTS
WHERE GENDER = 'C';
APPLICANT GENDER AGE
--------- ------ ---
0 record(s) selected.
数据库管理器对该查询返回不正确的答案,即使在表中找到值 'C' 亦如此,但此列上的约束告知数据库管理器唯一有效的值为 'M' 或 'F'。 在优化语句时,ENABLE QUERY OPTIMIZATION 关键字也允许数据库管理器使用此约束信息。 如果这不是您想要的行为,那么需要通过使用 ALTER TABLE 语句来更改约束,如以下示例所示: ALTER TABLE APPLICANTS
ALTER CHECK AGEOK DISABLE QUERY OPTIMIZATION
如果重新发出该查询,那么数据库管理器将返回下列正确结果: SELECT * FROM APPLICANTS
WHERE SEC = 'C';
APPLICANT GENDER AGE
--------- ------ ---
5 C 10
1 record(s) selected.
如果您可以保证应用程序是插入和更新数据的唯一应用程序,那么此时是使用 NOT ENFORCED TRUSTED 参考约束的最佳情形。 如果应用程序事先已检查所有信息(例如,以上示例中的性别和年龄),那么使用参考约束可能会导致性能更高并且不会做重复工作。 另一种可能使用参考约束的情形是设计数据仓库时。 而且,如果无法保证表中的数据将始终符合该约束,那么您可将约束设置为 NOT ENFORCED 和 NOT TRUSTED。 当不需要外键和主键中的值之间的严格匹配时,可以使用此类型的约束。 也可仍在允许优化某些 SQL 查询的统计视图中使用此约束。