数据的完整性用于确保数据库数据遵循特定的商业规则。
在Oracle 数据库中,可以使用约束、触发器和应用代码(过程、函数)3种方法实现数据的完整性。
今天我们主要讨论如何使用约束去保证数据的完整性和一致性。
1、约束的功能
通过一些强制性商业规则,保证数据的完整性、一致性
2、约束的类别
1) not null
2) check
3) unique
4) primary key (not null + unique)
5) foreign key (reference)
3、约束的状态
1)ENABLE VALIDATE(默认状态)
设定为此状态时,约束会立刻生效,并要求新、旧数据必须同时满足约束规则
11:43:19 SQL> alter table emp1
11:44:19   2   enable validate constraint  pk_emp1;
alter table emp1
*
ERROR at line 1:
ORA-02437: cannot validate (SCOTT.PK_EMP1) - primary key violated
-----新旧记录都必须符合约束
2)ENABLE NOVALIDATE
当设定为此状态时,约束会立刻生效,已存在的数据可以不满足约束规则,但新数据必须满足约束规则。
可以直接用于not null ,check ,foreign key 约束,对于primary key ,unique 的约束不能直接使用,因为对于primary key 和 unique  会生成唯一性索引,不能使用这种状态;要想使用这种状态,必须使用非唯一性索引。
11:37:46 SQL> create table emp1 as select * from emp;
Table created.
11:37:51 SQL> select * from emp1;
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH      CLERK           7902 17-DEC-80        800                    20
7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
7566 JONES      MANAGER         7839 02-APR-81       2975                    20
7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
7839 KING       PRESIDENT            17-NOV-81       5000                    10
7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
7900 JAMES      CLERK           7698 03-DEC-81        950                    30
7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
11:38:04 SQL> update emp1 set empno=7788 where ename='KING';
1 row updated.
11:39:00 SQL> select * from emp1 WHERE EMPNO=7788;
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
7788 KING       PRESIDENT            17-NOV-81       5000                    10
11:39:10 SQL>
——添加primary key ,到enable novalidate
11:39:10 SQL> alter table emp1 add constraint
11:39:42   2    pk_emp1 primary key (empno) enable novalidate;
pk_emp1 primary key (empno) enable novalidate
*
ERROR at line 2:
ORA-02437: cannot validate (SCOTT.PK_EMP1) - primary key violated
——原因:在建立primary key 它需要建立unique index
——在empno 上建立索引(非唯一性索引)
11:40:06 SQL> create index emp1_empno_ind on emp1(empno) tablespace indexes;
Index created.
11:42:17 SQL> alter table emp1 add constraint
11:42:20   2    pk_emp1 primary key (empno) using index enable novalidate ;
Table altered.
11:42:29 SQL>
——新的记录必须符合约束,旧的不检查
11:42:58 SQL> update emp1 set empno=7788 where ename='FORD';
update emp1 set empno=7788 where ename='FORD'
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_EMP1) violated
3)DISABLE VALIDATE
将约束设定为此状态时,不允许在表上执行任何的DML操作。对于主键和唯一性约束来讲,会删除相应的唯一索引,但约束规则任然有效。
4)DISABLE  NOVALIDATE
将约束设定为此状态时,数据可以不满足约束规则。对于主键和唯一性约束来讲,会删除相应的唯一索引。