Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

信息约束

Posted on 2010-05-18 23:16 Prayer 阅读(405) 评论(0)  编辑 收藏 引用 所属分类: DB2

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
(
EMPNO INT NOT NULL,
SEX CHAR(1) NOT NULL
CONSTRAINT SEXOK
CHECK (SEX IN ('M','F'))
NOT ENFORCED
ENABLE QUERY OPTIMIZATION,
SALARY INT NOT NULL,
CONSTRAINT SALARYOK
CHECK (SALARY BETWEEN 0 AND 100000)
NOT ENFORCED
ENABLE QUERY OPTIMIZATION
)

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。

NOT ENFORCED 选项

若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
(1, 'M', 54200),
(2, 'F', 28000),
(3, 'M', 21240),
(4, 'F', 89222),
(5, 'Q', 34444),
(6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。

ENABLE QUERY OPTIMIZATION 选项

在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
WHERE SEX = 'Q';

EMPNO SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
WHERE SEX = 'Q';

EMPNO SEX SALARY
----------- --- -----------
5 Q 34444

1 record(s) selected.


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理