第十二章 管理和维护数据完整性
<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>