约束种类:
1. Not Null ;
2.CHECK ;
3 UNIQUE ;
4. PRIMARY KEY ;
5 Foreign key ;
约束的相关信息可以从dba_constraints或者user_constraints 表中查询。
SQL> select table_name,constraint_name,constraint_type,status,deferrable,deferred,validated from user_constraints;
E SYS_C005184 C ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
EMP FK_DEPTNO R ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
DEPT PK_DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
EMP PK_EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
E SYS_C005183 C DISABLED NOT DEFERRABLE IMMEDIATE NOT VALIDATED
5 rows selected.
约束的状态:
约束的状态表现在两个方面
- enable 和 disable:这个表示在约束创建以后,对表做insert或者update操作时,对新进或者修改后的数据进行校验。以判断是否违反约束,enable表示是,disable表示否。
- validate 和 novalidate:这个表示约束创建时,是否对表中现有数据进行校验。以判断是否违反了约束,validate表示是,novalidate表示否。
- enable validate :表示新进和表中已有数据都校验。
- enable novalidate :表示不校验存在的数据,只校验新进的数据。
- disable novalidate :这种状态相当于没有创建约束。
- disable validate :不校验新进数据,但是要校验已有数据。这是一种矛盾的状态,所以表有了这样的约束时,不允许对表做DML操作。
一个constraint被创建时,默认的状态为 enable validate 。
create table employees as select * from emp where 1=2;
alter table employees add constraint u_empno unique(empno);
SQL> select table_name,constraint_name,status,validated from user_constraints where table_name='EMPLOYEES';
EMPLOYEES U_EMPNO
ENABLED VALIDATED
SQL>
这些状态各表示什么意思呢?
enable 、disable 选项针对新进数据、validate、novalidate针对老数据。
现在做实验验证一下:
create table ee as select * from emp;
insert into ee select * from ee;
此时,表ee中empno列存在了重复的值。我们在empno列上创建一个unique约束。
SQL> alter table ee add constraint u_ee_empno unique(empno);
alter table ee add constraint u_ee_empno unique(empno)
*
ERROR at line 1:
ORA-02299: cannot validate (SCOTT.U_EE_EMPNO) - duplicate keys found
因为默认的约束状态为
ENABLED VALIDATED ,所以约束创建之初要验证表中老数据,创建失败。那我们现在创建 ENABLE NOVALIDATE的约束试试看。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8858072/viewspace-471561/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8858072/viewspace-471561/