ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle concepts 4 - 数据完整性

oracle concepts 4 - 数据完整性

原创 Linux操作系统 作者:zhaojienju 时间:2010-10-18 15:36:48 0 删除 编辑

数据完整性

 

实现数据完整性的方式:

Trigger;用存储过程去控制对数据的访问;在数据库应用程序中实现;完整性约束。

 

使用完整性约束的好处:

1.很好定义;2。定义存在数据字典中,所用的应用程序都必须遵守。3。当装载大量数据时,可以先disable 完整性约束,很灵活。

 

完整性约束的种类:

1.NOT NULL

2.UNIQUE KEY。 建立索引

3.PRIMARY KEY:会为其建立索引 a unique index + not null constraint

4.FOREIGN KEY

5.CHECK

6.REF

 

 

外健有可能指向主表的primary key or unique key or null。所以插入数据时,健值可以为空。

 

当外健指向的主表值被修改或删除时:

1.默认不需更改。

2.DELETE CASCADE所有子表中的相关纪录被删除

3.DELETE SET NULL所有子表中的相关纪录被设置为null

 

外健一般情况下都需要索引,除非外健列在主表中从不被更新或删除。

建索引的优点:1。防止对子表的全表锁,只由行锁。

2.不需要子表的全表扫描。

 

约束可以enable, disable也可以validate, novalidate.

Enable/disable是针对新数据是否需要遵守,validate/novalidate是针对已有数据是否需要遵守。

 

Deferrable表示该约束是可延迟验证的。它有两个选项:

Initially immediate(默认):立即验证,执行完一个sql后就进行验证;

Initially deferred:延迟验证,当事务提交时或调用set constraint [all | ]immediate语句时才验证。区别是:事务提交时验证不通过,则立即回滚事务;set constraint immediate时只验证,不回滚事务。

那么看起来‘立即验证的可延迟约束’和‘不可延迟验证’似乎是一样的,都是执行完一个SQL后就进行验证。他们有什么区别吗?

其实区别就在于:‘立即验证的可延迟约束’是可以根据需要设置成‘延迟验证的可延迟约束’的,而‘不可延迟验证’是不能改变的。

 

 

deferrable用途

1)物化视图(快照),这是它的主要用途。这些视图会使用延迟约束来进行视图刷新。在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束。但到执行COMMIT时,数据完整性就没问题了,而且能满足约束。没有延迟约束,物化视图的约束可能会使刷新过程不能成功进行。

2)当预测是否需要更新父/子关系中的主键时,它有助于级联更新。

如果外键是不可延迟的,当需要更新父/子表中与外键相关的字段时,就会出现相互制约,无法更新的情况(而这种更新我们很可能会遇到,比如编号升级。)

如果你将外键设为可延迟、但初始化为立即执行,那么有什么影响呢?

通过前面的例子我们可以知道:正常使用时它和不可延迟的外键约束是一样的,执行SQL时立即验证。但此时你就可以将该约束设置为可延迟,然后将父键更新为一个新值(此时子关系的完整性约束不会被验证),最后再将子外键更新为这个新值。最后一起提交。只要所有受更新影响的子记录都指向现有的父记录,这条命令就能成功执行。

 

你可以在各种多语句事务中使用延迟约束,这些事务在处理的过程中需要暂时破坏完整性,但最后它们都会物归原样。

 

Oracle对约束的验证是在当前语句完整运行后,比如往employees 表中插入以行数据,manager_id就是employee_id。 只有在该行插入后,才有employee_id,那么manager_id才合理。

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

请登录后发表评论 登录
全部评论

注册时间:2010-10-05

  • 博文量
    80
  • 访问量
    205930