请教047题库中一道有意思的题目!!!

2. View the Exhibit and examine the description of the CUSTOMERS table.
You want to add a constraint on the CUST_FIRST_NAME column of the CUSTOMERS table so that the value inserted in the column does not have numbers. Which SQL statement would you use to accomplish the task?
A. ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name
CHECK(REGEXP_LIKE(cust_first_name,'^AZ')) NOVALIDATE
B. ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name
CHECK(REGEXP_LIKE(cust_first_name,'^[09]')) NOVALIDATE
C. ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name
CHECK(REGEXP_LIKE(cust_first_name,'[[:alpha:]]'))NOVALIDATE
D. ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name
CHECK(REGEXP_LIKE(cust_first_name,'[[:digit:]]'))NOVALIDATE
Answer: C
    题目要求是对表加一个约束,使其cust_first_name列中的值不能有纯数字,答案为C。
通过我的实验发现对于答案C来说约束的状态无论是novalidate和validate都可以达到需求,这里就不理解了,如果novalidate是不进行新值的校验,而validate则是对新值进行校验,既然是对于同样的约束条件,不同的约束状态怎么可能都达到同一校验结果呢?

操作步骤如下:
1.创建表t和t2
create table t(name varchar2(10));
create table t2(name varchar2(10));

2.分别对表t和t2添加不同状态的约束
alter table t add constraint name_c check(regexp_like(name,'[[:alpha:]]')) novalidate;
alter table t2 add constraint name_c2 check(regexp_like(name,'[[:alpha:]]'));

3.检查每个约束的状态
select constraint_name,status,validated from user_constraints      
where table_name in ('T','T2');                                            
CONSTRAINT_NAME     STATUS   VALIDATED                              
------------------------------ -------------- ----------------------
NAME_C                     ENABLED   VALIDATED
NAME_C2                   ENABLED   NOT VALIDATED

4.验证约束是否生效
SQL> insert into t values('a');
已创建 1 行。                                                                  
SQL> insert into t values('1');
insert into t values('1')                                       
*
第 1 行出现错误:                                                               
ORA-02290: 违反检查约束条件 (SCOTT.NAME_C)

SQL> insert into t2 values('b');
已创建 1 行。                                                                  
SQL> insert into t2 values('1');                                                
insert into t2 values('1')
*
第 1 行出现错误:                                                               
ORA-02290: 违反检查约束条件 (SCOTT.NAME_C2)

    结论:从以上操作步骤可以看到无论约束的状态为validated和novalidated都可以达到我们所要的需求,就是这块不是很理解,请各位指教,非常感谢!
标签: 暂无标签
wxjzqym

写了 7 篇文章,拥有财富 162,被 11 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P4 | 发表于 2012-6-5 14:01:38
CONSTRAINTS TYPE: NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
CONSTRAINTS 不但可以建立在TABLE上,也可以建立在VIEW上,
CONSTRAINTS 的状态:ENABLED/DISABLED
VALIDATED/NOVALIDATED
DEFERRABLE/NON-DEFERRABLE
DEFERRED/IMMEDIATE
RELY/NORELY


enable/disable对未来的数据有约束/无约束。

validate/novalidate对已有的数据有约束/无约束。

如果加约束到一个大表,那么ORACLE会LOCK这个表,然后SCAN所有数据,来判断是否符合CONSTRAINT的要求,在繁忙的系统里显然是不合适的。所以用enable novalidate比较合适,因为ORACLE仅仅会LOCK表一小段时间来建立CONSTRAINT,当CONSTRAINT建立后再VALIDATE,这时检验数据是不会LOCK表的。
回复

使用道具

P4 | 发表于 2012-6-5 13:39:20
我好像记混了。。
enable才是对新值得校验,validate是对旧值的校验!
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈