完整性约束的定义和检验
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
非延迟性约束也叫立即性约束:要在每一个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
相关文章推荐
- 数据库中完整性约束的SQL定义几点小解
- 数据库约束——用户定义完整性(User-defined Integrity)
- T-SQL :SQL Server 定义数据完整性 6大约束(三)
- 定义SQL Server层叠引用完整性约束
- MVC4 违反了引用完整性约束: 在此关系的主对象和依赖对象之间,定义引用约束的属性值不一致。
- 完整性约束的SQL定义
- 完整性约束的SQL定义
- 完整性约束的SQL定义
- 完整性约束的SQL定义
- 数据库-关系代数(类型、完整性约束、基本运算、扩展运算)
- IOS使用 Visual Format Language 定义水平和垂直约束
- 一、数据库概念与SQL语言基础——定义表、添加、修改约束
- 数据库的完整性约束
- 【转】一篇关于Oracle的完整性约束
- 级联引用完整性约束ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
- Oracle数据库设计——定义约束 Unique约束
- mysq用户自定义完整性之 添加检查约束。
- SQL SERVER中的约束与完整性
- 数据控制—完整性约束
- 数据库概论 --- 完整性约束