这个挺有意思的!呵呵
ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它!
也就是说在select的时候数据库会根据check的值来进行sql的OPTIMIZATION,因为check中没有'x',所以直接返回0条记录!
C:>db2 connect to dw164 user ccp
输入 ccp 的当前密码:
数据库连接信息
数据库服务器 = DB2/NT 8.2.0
SQL 授权标识 = CCP
本地数据库别名 = DW164
C:> db2 CREATE TABLE db2admin.ztest
db2 (cont.) => (
db2 (cont.) => id1 INT NOT NULL,
db2 (cont.) => id2 CHAR(1) NOT NULL
db2 (cont.) => CONSTRAINT c_ztest_id2
db2 (cont.) => CHECK (id2 IN ('1','2'))
db2 (cont.) => NOT ENFORCED ENABLE QUERY OPTIMIZATION,
db2 (cont.) => id3 INT NOT NULL,
db2 (cont.) => CONSTRAINT c_ztest_id3
db2 (cont.) => CHECK (id3 BETWEEN 10 AND 50)
db2 (cont.) => NOT ENFORCED ENABLE QUERY OPTIMIZATION
db2 (cont.) => )
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0601N 要创建的对象名与类型为"TABLE" 的现有名称 "DB2ADMIN.ZTEST" 相同。
SQLSTATE=42710
C:> db2 insert into db2admin.ztest values(1,'1',60),(2,'2',20),(3,'1',3),(4,'2
',34),(5, 'z',77),(6, 'x',140),(7,'1',3),(8,'2',24)
DB20000I SQL命令成功完成。
C:> db2 select * from db2admin.ztest
ID1 ID2 ID3
----------- --- -----------
6 x 140
6 x 140
5 z 77
7 1 3
5 z 77
7 1 3
1 1 60
2 2 20
3 1 3
4 2 34
8 2 24
1 1 60
2 2 20
3 1 3
4 2 34
8 2 24
16 条记录已选择。
C:> db2 select * from db2admin.ztest where id2 ='x'
ID1 ID2 ID3
----------- --- -----------
0 条记录已选择。
C:> db2 alter table db2admin.ztest alter check c_ztest_id2 disable query optim
ization
DB20000I SQL命令成功完成。
C:> db2 select * from db2admin.ztest where id2 ='x'
ID1 ID2 ID3
----------- --- -----------
6 x 140
6 x 140
2 条记录已选择。
C:>db2 terminate
DB20000I TERMINATE命令成功完成。
C:>
输入 ccp 的当前密码:
数据库连接信息
数据库服务器 = DB2/NT 8.2.0
SQL 授权标识 = CCP
本地数据库别名 = DW164
C:> db2 CREATE TABLE db2admin.ztest
db2 (cont.) => (
db2 (cont.) => id1 INT NOT NULL,
db2 (cont.) => id2 CHAR(1) NOT NULL
db2 (cont.) => CONSTRAINT c_ztest_id2
db2 (cont.) => CHECK (id2 IN ('1','2'))
db2 (cont.) => NOT ENFORCED ENABLE QUERY OPTIMIZATION,
db2 (cont.) => id3 INT NOT NULL,
db2 (cont.) => CONSTRAINT c_ztest_id3
db2 (cont.) => CHECK (id3 BETWEEN 10 AND 50)
db2 (cont.) => NOT ENFORCED ENABLE QUERY OPTIMIZATION
db2 (cont.) => )
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0601N 要创建的对象名与类型为"TABLE" 的现有名称 "DB2ADMIN.ZTEST" 相同。
SQLSTATE=42710
C:> db2 insert into db2admin.ztest values(1,'1',60),(2,'2',20),(3,'1',3),(4,'2
',34),(5, 'z',77),(6, 'x',140),(7,'1',3),(8,'2',24)
DB20000I SQL命令成功完成。
C:> db2 select * from db2admin.ztest
ID1 ID2 ID3
----------- --- -----------
6 x 140
6 x 140
5 z 77
7 1 3
5 z 77
7 1 3
1 1 60
2 2 20
3 1 3
4 2 34
8 2 24
1 1 60
2 2 20
3 1 3
4 2 34
8 2 24
16 条记录已选择。
C:> db2 select * from db2admin.ztest where id2 ='x'
ID1 ID2 ID3
----------- --- -----------
0 条记录已选择。
C:> db2 alter table db2admin.ztest alter check c_ztest_id2 disable query optim
ization
DB20000I SQL命令成功完成。
C:> db2 select * from db2admin.ztest where id2 ='x'
ID1 ID2 ID3
----------- --- -----------
6 x 140
6 x 140
2 条记录已选择。
C:>db2 terminate
DB20000I TERMINATE命令成功完成。
C:>
结论:
NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列!也就是说插入数据的时候没有强行限制!
NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列!也就是说插入数据的时候没有强行限制!
ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它!
也就是说在select的时候数据库会根据check的值来进行sql的OPTIMIZATION,因为check中没有'x',所以直接返回0条记录!
这个不错!
看来有时候眼见还真不一定为实啊!!!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/694276/viewspace-426835/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/694276/viewspace-426835/