在开发过程中难免会遇见这样的问题:在使用了一段数据库后需要在数据库的某一个表上增加约束条件 ,来减少前台的校验工作,将校验工作交给数据库来处理。但是在增加约束时会遇到一个这样的问题,就是已经存在的历史数据不是都满足这个约束条件的,这样的话你加约束就会失败。典型的问题是:你要使某一列为非空,但是在最开始建表的时候,并没有考虑到这个问题,造成当前表中好多行的该字段的值为空,当然我们有办法来搞定它,就是将空的都赋值,然后我们再增加约束,但是这终究是个治标不治本的问题。
基于上述原因,有必要对oracle的约束进行考究,原来oralce的约束状态有四种:
1.enable validate;
--当将约束状态转变为这种状态时需要新旧数据都要满足这种需求,这也是默认的状态。
2.enable novalidate;
--只对新数据产生作用,旧的数据不用次约束来检查,即增加此约束后的新数据要满足这种要求。
3.disable validate;
--不允许在表上执行任何DML操作。
4.disable novalidate;
--数据可以不满足约束规则。
应用实例:我在scott上做测试。
create table t_operator_info(longin_name varchar2(20),password varchar2(20));
--增加主键约束:
alter table t_operator_info add constraint pk_login_name primary key(login_name);
--插入两条数据:
insert into t_operator_info values ('admin','admin');
insert into t_operator_info values ('manager,123);
commit;
--增加约束条件,使得login_name的长度不能少于6位,但是现在已经存在少于6位的数据,因此我增加
下面的约束时会报错:
alter table t_operator_info add constraint check_login_name check(length(login_name)>=6);
ORA-02293: 无法验证 (SCOTT.CON_CHECK) - 违反检查约束条件
但是我如果提供了该约束的状态后就不会报错:
alter table t_operator_info add constraint check_login_name check(length(login_name)>=6) enable novalidate;
Table altered.
至此问题解决。