完整性约束分为延迟性约束和非延迟性约束两大类。
非延迟性约束也叫立即性约束:要在每一个DML语句结束时进行数据完整性的检查。如果有数据违反了约束条件,该语句将被回滚。
但是,这种操作方式在某些应用中会带来不便,如一些订单或发票系统。这些系统一般是以表单的方式输入数据的,每个表单上可能同时有多个表,而这些表都建立了主键和外键的联系。此时在进行数据输入时,数据的输入就与输入次序相关了。这样就对系统开发人员和数据的录入人员的要求增高了。对系统的开发和维护可以说都不是一个福音。
因此,Oracle又引入了另一类约束,那就是延迟性约束。
延迟性约束:仅在每一个事务提交时进行数据完整性的检查。如果有数据违反了约束
条件,整个事务将被回滚。
将一个约束定义成延迟性(deferred)约束可以使用以下两种方法中的一种:
*将约束定义成Initially Immediate:除非显式的设置这一约束,否则约束默认功能与非延迟性相同。
*
约束定义成Initially Deferred:约束默认功能就是在每一个事务结束时进行数据完整性的检查。
举例:
1.
SQL> select constraint_name,table_name,constraint_type,status,deferrable,
2 deferred,validated from dba_constraints
3 where owner='SCOTT';
CONSTRAINT_NAME TABLE_NAME C STATUS DEFERRABLE DEFERRED VALIDATED
---------------- ------------ - -------- -------------- --------- -------------
PK_DEPT DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
PK_EMP EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
FK_DEPTNO EMP R ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
查询结果显示constraint_type,P表示主键约束,R表示外键约束。
STATUS,enabled表示处于激活状态。
deferrable列,显示约束都是非延迟的。
deferred列:显示初始的延迟状态为immediate.
2.
SQL> set constraints scott.fk_deptno,scott.pk_emp immediate;
set constraints scott.fk_deptno,scott.pk_emp immediate
*
ERROR at line 1:
ORA-02447: cannot defer a constraint that is not deferrable
错误显示:不能修改任何非延迟性约束的延迟状态。
3.
SQL> alter table scott.event
2 add constraint event_evtid_pk
3 primary key(evtid)
4 deferrable
5 using index
6 storage(initial 300k next 300k)
7 tablespace longshen;
Table altered.
using index是将约束索引放在不同的表空间中
4.
SQL> select segment_name,segment_type,tablespace_name,initial_extent,
2 next_extent
3 from
4 dba_segments
5 where tablespace_name like 'LONG%';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_N INITIAL_EXTENT NEXT_EXTENT
------------ --------------- ------------ -------------- -----------
PRODUCT TABLE LONGSHEN 65536 1048576
BIN$4W++j6uQ TABLE LONGSHEN 1048576 1048576
SGTgQAB/AQBp
bw==$0
EMP_ENAME_ID INDEX LONGSHEN 516096 1048576
X
EMP_JOB_IDX INDEX LONGSHEN 311296 1048576
EVENT_EVTID_ INDEX LONGSHEN 311296 1048576
PK
5.
SQL> select constraint_name,table_name,constraint_type,status,deferrable,
2 deferred,validated from
3 dba_constraints
4 where owner='SCOTT';
CONSTRAINT_NAME TABLE_NAME C STATUS DEFERRABLE DEFERRED VALIDATED
---------------- ------------ - -------- -------------- --------- -------------
PK_DEPT DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
PK_EMP EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
FK_DEPTNO EMP R ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
EVENT_EVTID_PK EVENT P ENABLED DEFERRABLE IMMEDIATE VALIDATED
非延迟性约束也叫立即性约束:要在每一个DML语句结束时进行数据完整性的检查。如果有数据违反了约束条件,该语句将被回滚。
但是,这种操作方式在某些应用中会带来不便,如一些订单或发票系统。这些系统一般是以表单的方式输入数据的,每个表单上可能同时有多个表,而这些表都建立了主键和外键的联系。此时在进行数据输入时,数据的输入就与输入次序相关了。这样就对系统开发人员和数据的录入人员的要求增高了。对系统的开发和维护可以说都不是一个福音。
因此,Oracle又引入了另一类约束,那就是延迟性约束。
延迟性约束:仅在每一个事务提交时进行数据完整性的检查。如果有数据违反了约束
条件,整个事务将被回滚。
将一个约束定义成延迟性(deferred)约束可以使用以下两种方法中的一种:
*将约束定义成Initially Immediate:除非显式的设置这一约束,否则约束默认功能与非延迟性相同。
*
约束定义成Initially Deferred:约束默认功能就是在每一个事务结束时进行数据完整性的检查。
举例:
1.
SQL> select constraint_name,table_name,constraint_type,status,deferrable,
2 deferred,validated from dba_constraints
3 where owner='SCOTT';
CONSTRAINT_NAME TABLE_NAME C STATUS DEFERRABLE DEFERRED VALIDATED
---------------- ------------ - -------- -------------- --------- -------------
PK_DEPT DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
PK_EMP EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
FK_DEPTNO EMP R ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
查询结果显示constraint_type,P表示主键约束,R表示外键约束。
STATUS,enabled表示处于激活状态。
deferrable列,显示约束都是非延迟的。
deferred列:显示初始的延迟状态为immediate.
2.
SQL> set constraints scott.fk_deptno,scott.pk_emp immediate;
set constraints scott.fk_deptno,scott.pk_emp immediate
*
ERROR at line 1:
ORA-02447: cannot defer a constraint that is not deferrable
错误显示:不能修改任何非延迟性约束的延迟状态。
3.
SQL> alter table scott.event
2 add constraint event_evtid_pk
3 primary key(evtid)
4 deferrable
5 using index
6 storage(initial 300k next 300k)
7 tablespace longshen;
Table altered.
using index是将约束索引放在不同的表空间中
4.
SQL> select segment_name,segment_type,tablespace_name,initial_extent,
2 next_extent
3 from
4 dba_segments
5 where tablespace_name like 'LONG%';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_N INITIAL_EXTENT NEXT_EXTENT
------------ --------------- ------------ -------------- -----------
PRODUCT TABLE LONGSHEN 65536 1048576
BIN$4W++j6uQ TABLE LONGSHEN 1048576 1048576
SGTgQAB/AQBp
bw==$0
EMP_ENAME_ID INDEX LONGSHEN 516096 1048576
X
EMP_JOB_IDX INDEX LONGSHEN 311296 1048576
EVENT_EVTID_ INDEX LONGSHEN 311296 1048576
PK
5.
SQL> select constraint_name,table_name,constraint_type,status,deferrable,
2 deferred,validated from
3 dba_constraints
4 where owner='SCOTT';
CONSTRAINT_NAME TABLE_NAME C STATUS DEFERRABLE DEFERRED VALIDATED
---------------- ------------ - -------- -------------- --------- -------------
PK_DEPT DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
PK_EMP EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
FK_DEPTNO EMP R ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
EVENT_EVTID_PK EVENT P ENABLED DEFERRABLE IMMEDIATE VALIDATED