数据的完整性用于确保数据库数据遵循特定的商业规则。
在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
将约束设定为此状态时,数据可以不满足约束规则。对于主键和唯一性约束来讲,会删除相应的唯一索引。