ORACLE约束的属性(五)

2014-11-24 14:23:43 · 作者: · 浏览: 4
950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
8000 TOM SALESMAN 7839 15-JUL-12 2000 50
有一条脏数据存在,看看能不能再增加一条:
SQL> insert into empx (empno,ename,job,mgr,hiredate,sal,deptno) values (8001,'TOM','SALESMAN',7839,sysdate,2000,50);
insert into empx (empno,ename,job,mgr,hiredate,sal,deptno) values (8001,'TOM','SALESMAN',7839,sysdate,2000,50)
* www.2cto.com
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_DEPTX) violated - parent key not found
不能增加违反约束的数据,novalidate的约束只是对原来的数据库不做验证,但对新插入的数据还是要进行验证的。
4. disable, enalbe(default value)
启用和禁用constraint.如果在新建pk和uk时定义了disable,将不建立相应的索引.
SQL> alter table empx disable constraint fk_deptx;
Table altered.
SQL> select constraint_name, SEARCH_CONDITION cond, STATUS, DEFERRABLE, DEFERRED, VALIDATED from user_constraints where table_name='EMPX';
[plain]
CONSTRAINT_NAME COND STATUS DEFERRABLE DEFERRED VALIDATED
---------------- ---------------- ------------------------ ---------------- ---------------- ----------------
PK_EMPX ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
FK_DEPTX DISABLED NOT DEFERRABLE IMMEDIATE NOT VALIDATED
SQL> insert into empx (empno,ename,job,mgr,hiredate,sal,deptno) values (8001,'TOM','SALESMAN',7839,sysdate,2000,50);
1 row created.
SQL> commit;
Commit complete.
禁用了约束后,脏数据也能插入成功。
SQL> alter table empx enable constraint fk_deptx;
alter table empx enable constraint fk_deptx
*
ERROR at line 1:
ORA-02298: cannot validate (SCOTT.FK_DEPTX) - parent keys not found
SQL> select constraint_name, SEARCH_CONDITION cond, STATUS, DEFERRABLE, DEFERRED, VALIDATED from user_constraints where table_name='EMPX';
[plain]
CONSTRAINT_NAME COND STATUS DEFERRABLE DEFERRED VALIDATED www.2cto.com
---------------- ---------------- ------------------------ ---------------- ---------------- ----------------
PK_EMPX ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
FK_DEPTX DISABLED NOT DEFERRABLE IMMEDIATE NOT VALIDATED
SQL> alter table empx enable novalidate constraint fk_deptx;
Table altered.
SQL> select constraint_name, SEARCH_CONDITION cond, STATUS, DEFERRABLE, DEFERRED, VALIDATED from user_constraints where table_name='EMPX';
[plain]
CONSTRAINT_NAME COND STATUS DEFERRABLE DEFERRED VALIDATED
---------------- ---------------- ------------------------ ---------------- ---------------- ----------------
PK_EMPX ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
FK_DEPTX ENABLED NOT DEFERRABLE IMMEDIATE NOT VALIDATED
如果有脏数据,启用约束时要同时设置novalidate。
www.2cto.com
由上面的实验得知,默认情况下, Oracle constraint是不开启延迟约束和原有数据保留验证的。
下列情况下可以使用这些特性:
1)批量数据导入、物化视图刷新的时候,事务量很大,而且存在数据规律前后颠倒的情况
此时,如果开启着立即约束应用的开关,可能存在一些暂时性的约束不满足的情况,从而影响到整个 系统的运行。开启约束延迟验证,就可以帮助我们解决这个问题;
2)在历史数据移植
历史数据存在不规则的情况,很多时候难以满足我们新系统的数据完整性要求。可以使用not validate的方式,对历史数据不进行约束控制,而只针对新数据开启验证。