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

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

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

 

至此问题解决。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值