完整性约束的定义和检验

完整性约束分为延迟性约束和非延迟性约束两大类。
非延迟性约束也叫立即性约束:要在每一个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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值