关于存在历史数据的表新增约束的问题
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.
至此问题解决。
基于上述原因,有必要对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.
至此问题解决。
相关文章推荐
- 关于EXCEL数据导入到SQLSERVER中字段存在NULL的问题
- 关于EXCEL数据导入到SQLServer中字段存在NULL的问题
- java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
- Oracle存储过程游标循环更新新增字段处理线上历史数据问题
- java:关于short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的简单数据类型转换问题的理解
- 关于用"独立存贮空间"存数据存在的问题
- 关于在asp.net中使用showDialogModal方式输入数据中存在的问题
- 关于EXCEL数据导入到SQLSERVER中字段存在NULL的问题
- 关于JBPM4.4无法删除历史数据的问题
- 关于EXCEL数据导入到SQLServer中字段存在NULL的问题
- 关于get、post传递的参数存在特殊符号时产生错误的问题
- 关于重复提交数据问题的解决方案
- 关于使用httpclient传递json数据乱码的问题
- 关于listview中新增一条记录时,最后两条消息重复的问题。
- 关于使用PHPExcel将页面数据导入EXCEL表时乱码的问题
- 关于串口接收数据不全的问题
- 关于oracle导入sqlserver存在的唯一索引问题
- 关于int8_t,uint8_t.....等数据类型的问题
- 关于带泛型约束的虚函数在托管函数中的调用问题
- 关于activity被重启后viewpager的数据不刷新的问题