学习资料

学习的笔记


第十二章 管理和维护数据完整性

<p>[TOC]</p> <h2>数据的完整性</h2> <ul> <li>有三种方法维护数据的完整性 Oracle 的完整性约束 数据库触发器 应用程序代码</li> </ul> <h2>完整性约束的类型</h2> <ul> <li>五大类完整性约束 非空 唯一 主键 外键 条件</li> </ul> <h2>完整性约束的状态</h2> <ul> <li>完整性约束的四种状态 disable novalidate disable validate enable novalidate enable validate</li> </ul> <h2>完整性约束的检验与定义</h2> <ul> <li>按照检验时间分两种 非延迟性约束(立即性):<code>dba_constraints.deferrable=not deferrable</code> 延迟性约束(事务提交后检测):<code>dba_constraints.deferrable=deferrable</code></li> </ul> <pre><code>--查看HR用户的约束 select constraint_name,table_name,constraint_type,status,deferrable,deferred,validated from dba_constraints where owner='HR'; --如下三键关系,修改EMP_EMP_ID_PK、EMP_DEPT_FK属性dba_constraints.deferred select constraint_name,table_name,constraint_type,status,deferrable,deferred,validated from dba_constraints where owner='HR' and constraint_name in ('EMP_DEPT_FK','EMP_EMP_ID_PK','DEPT_ID_PK'); --hr.EMPLOYEES的主键 EMP_EMP_ID_PK --hr.employees.EMP_DEPT_FK 外键,来自hr.departments.department_id --如下报错结论:不能修改任何非延迟性约束的延迟状态。 --dba_constraints.deferrable=not deferrable 不能修改deferred set constraints hr.EMP_EMP_ID_PK,hr.EMP_DEPT_FK immediate; set constraints hr.EMP_EMP_ID_PK,hr.EMP_DEPT_FK deferred; --报错: --cannot defer a constraint that is not deferrable --使用hr.emp、hr.dept表试验 select * from hr.emp ; --创建主键索引为延迟性约束,使用indx表空间 alter table hr.emp add constraint emp_employee_id_pk primary key (employee_id) deferrable using index storage (initial 300K next 300K) tablespace indx ; --查看索引是否按照要求创建,deferrable=DEFERRABLE 延迟性 select segment_name,segment_type,tablespace_name,initial_extent,next_extent from dba_segments where tablespace_name='INDX'; select constraint_name,table_name,constraint_type,status,deferrable,deferred,validated from dba_constraints where owner='HR' and table_name in('EMP','EMPLOYEES'); --因为创建约束时没有使用initially deferred 所以创建的约束与非延迟性约束一样的,修改如下参数没变化 set constraints hr.EMP_EMPLOYEE_ID_PK immediate; set constraints hr.EMP_EMPLOYEE_ID_PK deferred; --创建hr.dept的department_id列为主键 select * from hr.dept ; alter table hr.dept add constraint dept_department_id_pk primary key (department_id) deferrable initially deferred using index storage (initial 300K next 300K) tablespace indx; select constraint_name,table_name,constraint_type,status,deferrable,deferred,validated from dba_constraints where owner='HR' and table_name in('EMP','EMPLOYEES','DEPT'); --修改也是没有变化的 set constraints hr.DEPT_DEPARTMENT_ID_PK immediate; set constraints hr.DEPT_DEPARTMENT_ID_PK deferred;</code></pre> <h2>定义和维护约束的指导原则</h2> <h2>关闭(禁止)和开启(激活)约束</h2> <h2>重新命名和删除约束</h2>

页面列表

ITEM_HTML