数据完整性
实现数据完整性的方式:
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 |
那么看起来‘立即验证的可延迟约束’和‘不可延迟验证’似乎是一样的,都是执行完一个SQL后就进行验证。他们有什么区别吗?
其实区别就在于:‘立即验证的可延迟约束’是可以根据需要设置成‘延迟验证的可延迟约束’的,而‘不可延迟验证’是不能改变的。
deferrable用途
1)物化视图(快照),这是它的主要用途。这些视图会使用延迟约束来进行视图刷新。在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束。但到执行COMMIT时,数据完整性就没问题了,而且能满足约束。没有延迟约束,物化视图的约束可能会使刷新过程不能成功进行。
2)当预测是否需要更新父/子关系中的主键时,它有助于级联更新。
如果外键是不可延迟的,当需要更新父/子表中与外键相关的字段时,就会出现相互制约,无法更新的情况(而这种更新我们很可能会遇到,比如编号升级。)
如果你将外键设为可延迟、但初始化为立即执行,那么有什么影响呢?
通过前面的例子我们可以知道:正常使用时它和不可延迟的外键约束是一样的,执行SQL时立即验证。但此时你就可以将该约束设置为可延迟,然后将父键更新为一个新值(此时子关系的完整性约束不会被验证),最后再将子外键更新为这个新值。最后一起提交。只要所有受更新影响的子记录都指向现有的父记录,这条命令就能成功执行。
你可以在各种多语句事务中使用延迟约束,这些事务在处理的过程中需要暂时破坏完整性,但最后它们都会物归原样。
Oracle对约束的验证是在当前语句完整运行后,比如往employees 表中插入以行数据,manager_id就是employee_id。 只有在该行插入后,才有employee_id,那么manager_id才合理。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11903161/viewspace-676188/ ,如需转载,请注明出处,否则将追究法律责任。