您的位置:首页 > 其它

完整性约束的定义和检验

2013-07-16 16:02 218 查看
完整性约束分为延迟性约束和非延迟性约束两大类。

非延迟性约束也叫立即性约束:要在每一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: