您的位置:首页 > 其它

关于存在历史数据的表新增约束的问题

2010-01-05 21:50 211 查看
在开发过程中难免会遇见这样的问题:在使用了一段数据库后需要在数据库的某一个表上增加约束条件 ,来减少前台的校验工作,将校验工作交给数据库来处理。但是在增加约束时会遇到一个这样的问题,就是已经存在的历史数据不是都满足这个约束条件的,这样的话你加约束就会失败。典型的问题是:你要使某一列为非空,但是在最开始建表的时候,并没有考虑到这个问题,造成当前表中好多行的该字段的值为空,当然我们有办法来搞定它,就是将空的都赋值,然后我们再增加约束,但是这终究是个治标不治本的问题。

基于上述原因,有必要对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.



至此问题解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: