管理和维护数据完整性


学习内容

1         

什么是数据的完整性

所谓的数据的完整性就是在数据库中符合公司商业规则的有效数据。

2

有哪几种主要的方法来维护数据的完整性

oracle的完整性约束---------强加在表上的规则或条件。------------oracle自带的,可靠性和效率都很好

数据库触发器、应用程序代码------------都需要依赖程序员编码,程序员的水平决定系统的可靠性、安全性和效率。

3

oralce系统提供了几种约束

非空( NOT NULL )约束:所定义的列决不能为空

唯一(UNIQUE)约束:在表中的每一行中所定义的这个列或者这些列的值都不能相同

主键(PRIMARY  KRY)约束:指明一列或几列的组合为该键的主键。主键唯一的标识表中的每一行,并且主键不能包括空值。

外键(FOREIGN  KEY)约束:指明一列或几列的组合为外键以维护从表(child  table)和主表(parent  table)之间的引用完整性(referebtial  integrity

条件(check)约束:表中每一行都要满足该约束条件。

4

完整性约束可能所处的4中状态

DISABLE  NOVALIDATE(禁止而无效):不做任何约束所定义的检查。

DISABLE   VALIDATE(禁止而有效):表中由约束所限制的列不能做任何的修改。

ENABLE   NOVALIDATE(激活而无效):新的违反约束的数据不能输入到表中。

ENABLE  VALIDATE(激活而有效):任何违反约束的数据行都不能插入到表中。

当一个约束从禁止(disabled)状态变为ENABLE  VALIDATE时,表中所有的数据都会被上锁以检验数据的完整性。这可能会造成DML操作的等待,因此建议:为了系统的效率,在生成(商业)数据库系统上最好不要在繁忙时间将约束从禁止状态变为ENABLE  VALIDATE.

但是在繁忙期间可以先将约束从禁止状态变为ENABLE  NOVALIDATE状态,之后等系统平静下来,再将约束改为ENABLE  VALIDATE状态。

5

延迟性约束和非延迟性约束

非延迟性约束也叫立即性(immediate)约束:要在一个DML语句结束时进行数据完整性的检查。如果有效数据违反了约束条件,该语句将被回滚。

延迟性约束:仅在每一个事物(transaction)提交时进行数据完整性的检查。如果有数据违反了约束条件,整个事物将被回滚。

6

怎样定义延迟性约束:

延迟性约束:仅在每一个事物(transaction)提交时进行数据完整性的检查。如果有数据违反了约束条件,整个事物将被回滚。

下面做一些实验进行演示:

首先从数据字典dba_contraints中获取scott用户所拥有的约束信息。

SQL> col  CONSTRAINT_NAME        for a16;

SQL> col  TABLE_NAME        for a12;

SQL> select CONSTRAINT_NAME,TABLE_NAME, CONSTRAINT_TYPE,STATUS, DEFERRABLE,DEFERRED,VALIDATED

  2  from dba_constraints

  3  where owner='SCOTT';

 

CONSTRAINT_NAME  TABLE_NAME   C STATUS         DEFERRABLE        DEFERRED  VALIDATED

---------------- ------------ - -------- -------------- --------- -------------

FK_DEPTNO         EMP              R ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED

PK_DEPT          DEPT              P ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED

PK_EMP                 EMP              P ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED

C-----------check,条件约束和非空约束

R-----------referential  integrity,外键

P-----------primary   key,主键

 

 

7

怎样改变延迟状态

 

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

SQL> set constraints scott.fk_deptno,scott.pk_emp deferred;

set constraints scott.fk_deptno,scott.pk_emp deferred

*

ERROR at line 1:

ORA-02447: cannot defer a constraint that is not deferrable

由以上的错误信息提示可以得到:不能修改任何非延迟性约束的延迟状态。

8

定义和维护约束时应该遵循的原则

对于主键和唯一键:

1、利用USING  INDEX子句将约束的索引放在(与表)不同的表空间中。

2、如果经常有大规模数据的装入,使用非唯一索引。

对于自引用的外键:

1、在初始装入数据之后再定义或者开启外键。

2、延迟约束的检查。

9

关闭和开启约束的操作

1、首先在scott用户下创建一个表person

SQL> create table person

  2  (personid  number(7)

  3  ,name     varchar2(20)

  4  ,birthday   varchar2(20)

  5  ,edulevel   varchar2(20)

  6  ,passaway   number(20));

 

Table created.

2、向SCOTT用户下的person(人物)表插入一条名为君晓的记录,该记录的personid(主键)为001

SQL>  insert into person

  2   (personid,name,birthday,edulevel ,passaway )

  3    values('001','junxiao',null,null,null);

 

1 row created.

3、验证一下是否插入名为junxiao的一条记录

SQL> col name for a10;

SQL>  select * from person;

 

 

  PERSONID NAME       BIRTHDAY                   EDULEVEL                  PASSAWAY

---------- ---------- -------------------- -------------------- ----------

 1 junxiao

4、接下来载使用DML语句向person表插入一条名为xiaoxiao的记录,该记录的personid(主键)也为001

SQL> insert into person

  2  (personid,name,birthday,edulevel,passaway)

  3  values ('001','xiaoxiao',null,null,null);

 

1 row created.

竟然插入成功了,既然已经在personid一列加入了主键约束,为什么还是能插入主键相同的(都为001)两条记录呢?其实这是因为这个主键约束时一个延迟性约束。

5、接下来我们提交所做的插入命令,看会怎样?

提交的话应该会失败的,因为他违反了主键约束,但是我的不知道什么地方出问题了,居然提交成功了。

10

怎样将一个约束重新命名

 

SQL> alter table scott.emp

  2  rename constraint PK_EMP

  3  to emp_empno_pk;

 

Table altered.

SQL> select CONSTRAINT_NAME,TABLE_NAME,CONSTRAINT_TYPE,STATUS,DEFERRABLE, DEFERRED,VALIDATED        

  2  from dba_constraints

  3  where owner='SCOTT';

 

CONSTRAINT_NAME  TABLE_NAME   C STATUS         DEFERRABLE        DEFERRED  VALIDATED

---------------- ------------ - -------- -------------- --------- -------------

FK_DEPTNO         EMP              R ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED

PK_DEPT          DEPT              P ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED

EMP_EMPNO_PK         EMP              P ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED

 

11

怎样删除一个约束

SQL> alter table scott.emp

  2  drop constraint FK_DEPTNO;

 

Table altered.

 

SQL> select CONSTRAINT_NAME,TABLE_NAME,CONSTRAINT_TYPE,STATUS,DEFERRABLE, DEFERRED,VALIDATED        

  2  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

EMP_EMPNO_PK         EMP              P ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED

 

问题:

开启和关闭约束的操作过程出现了问题。同时插入了一条personid001的三条记录,结果都能提交成功,按照原理的话不应该是提交失败的吗,因为会违反主键约束的!可能我是哪做错了吧,完了继续研究一下。

 

总结:

总的一章学习下来,主要就是创建约束,修改约束名,删除约束之类的,感觉这一章的内容更加偏向开发层面。可能平时做的比较少,学的稍微有点慢,而且还会在概念上纠结好久。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30606702/viewspace-2120514/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30606702/viewspace-2120514/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值