方案对象管理之第十一章数据的完整性与其它方案对象第十一章数据的完整性及其它方案对象知识技能目标与要求(1)实现数据完整性约束(2)管理数据约束(3)获得约束的信息(4)了解其它方案对象的功能、作用、创建和维护方法本章重点掌握用OEM和命令行方式创建和管理完整性约束的方法本章难点设置完整性约束的方法课时2课时【教学导航】第十一章数据的完整性及其它方案对象11.1数据的完整性11.2管理完整性约束11.2.1oracle提供的约束条件11.2.2数据完整性约束的创建11.2.3数据完整性约束的维护11.2.4获取数据完整性约束的信息11.3其它方案对象索引视图存储过程触发器同义词序列第十一章数据的完整性及其它方案对象(1)创建/删除CHECK约束。(2)创建/删除PRIMARYKEY和UNIQUE约束。(3)创建/删除FOREIGNKEY约束。【任务描述】11.1数据的完整性数据库不仅仅是存储数据,还必须保证所保存的数据的正确性、完整性和可靠性数据的完整性是关系数据库模型的基本原则,是用户在表上定义的一系列规则或约束条件,以及在表之间定义的一系列相互关系。其作用就是强制要求数据库只能接受正确的、合理的数据,防止错误的或无效的数据被插入到表中。完整性保护防止不合语义的数据进入数据库例:员工的性别只能是男或女;员工的编号一定是惟一的;员工所在的部门必须是公司已存在的部门11.1数据的完整性数据的完整性和安全性是两个不同的概念数据的完整性:是防止数据库中存在不符合语义的数据,保证数据库中数据是正确的,避免非法的不合语义的错误数据的输入和输出,即所谓的“垃圾进垃圾出”所造成的无效操作和错误结果。数据的安全性:是保护数据库防止恶意的破坏和非法的存取。即,安全性措施的防范对象是非法用户和非法操作;完整性措施的防范对象是不合语义的数据。数据完整性与安全性11.1数据的完整性维护数据的完整性的方法ApplicationcodeTableDataIntegrityconstraintDatabasetrigger11.2管理完整性约束ORACLE系统支持四种类型的数据完整性:1.域完整性:域完整性为列级和元组级完整性。它为列或列组指定一个有效的数据集,并确定该列是否允许为空。2.实体完整性:实体完整性为表级完整性,它要求表中所有的元组都应该有一个惟一的标识符3.引用完整性:参照完整性是表级完整性,它维护参照表中的外码与被参照表中主码的相容关系。4.用户定义完整性11.2.1数据完整性的类型11.2管理完整性约束约束的类型PRIMARYKEY主键约束FOREIGNKEY外键约束UNIQUE唯一约束CHECK检查约束NULL空值约束CASCADE级联引用一致性约束11.2.1数据完整性约束的类型决定使用何种约束(约束类型)完整性类型约束类型描述域DEFAULT如果在INSERT语句中未显式提供值,则指定为列提供的值CHECK指定列中可接受的数据值REFERENTIAL基于其他表中的列的值,指定可接受的用于更新的数据值实体PRIMARYKEY惟一标识每一列,确保用户没有输入重复的值。同时创建一个索引以增强性能。不允许空值UNIQUE确保在非主键列中不输入重复值,并创建一个索引以增强性能。允许空值引用FOREIGNKEY定义一列或多列的值与同表或其他表中主键的值匹配CHECK基于同表中其他列的值,指定列中可接受的数据值11.2管理完整性约束ENABLENOVALIDATE(激活而无效)ExistingdataNewdataDISABLENOVALIDATE(禁止而无效)DISABLEVALIDATE(禁止而有效)==ENABLEVALIDATE(激活而有效)11.2.2完整性约束的状态完整性约束的各种状态之间的变化遵循以下的原则:如果在激活(ENABLE)约束时没有说明NOVALIDATE,则默认为ENABLEVALIDATE如果在禁止(DISABLE)约束时没有说明VALIDATE,则默认为DIABLENOVALIDATE如果惟一约束或主键约束从禁止(DISABLE)状态变为激活(ENABLE)状态时没有索引,系统会自动地为之创建一个惟一索引。反之则会自动删除惟一索引。当任何一个约束从NOVALIDATE状态变为VALIDATE状态时,系统会检查所有的数据。反之,不进行数据检查。将一个约束从ENABLENOVALIDATE状态变为ENABLEVALIDATE状态时,系统仍可以进行任何的读、写及其他的DDL操作。11.2管理完整性约束11.2.2完整性约束的状态11.2管理完整性约束DMLstatementChecknondeferredconstraintsCOMMITCheckdeferredconstraints11.2.3约束的检验11.2管理完整性约束包含所有约束的基本描述信息USER_CONSTRAINTSDBA_CONSTRAINTSALL_CONSTRAINTS包含定义了约束的字段信息,利用这些视图可以查看约束被定义在哪些字段上。DBA_CONS_COLUMNSALL_CONS_COLUMNSUSER_CONS_COLUMNS11.2.4获取约束的信息11.2管理完整性约束例11-1:获取有关约束的信息获取数据完整性约束的信息Sqlcolconstraint_namefora16coltable_namefora12selectconstraint_name,table_name,constraint_type,status,deferrable,deferred,validatedfromdba_constraintswhereowner='SCOTT';11.2管理完整性约束获取数据完整性约束的信息例11-2:查询定义了约束的列SQLSelecttable_name,constraint_name,column_name,positonfromuser_cons_columnswheretable_name=‘EMP’;11.2管理完整性约束使用CREATETABLE或者ALTERTABLECREATETABLE是在创建表时创建约束ALTERTABLE是在一个已有的表上创建约束可以添加约束到已有数据的表上可添加单列或多列约束若约束应用于单列----列级约束若约束引用了多列----表级约束,即使它并没有引用表中的所有列11.2.5数据完整性约束的创建11.2管理完整性约束定义约束的指南主键和唯一键:将它们的索引放在(与表)不同的表空间中。如果经常有大规模数据的装入使用非唯一索引。自引用的外键:在初始装入数据之后再定义或开启外键。延迟约束的检查。11.2管理完整性约束CREATETABLEscott.employee(empidnumber(5)primarykey,enamevarchar2(15)notnull,ssexvarchar2(6),agenumber(4),jobvarchar2(10),hiredatedatedefault(sysdate),deptnonumber(3)notnull,CONSTRAINTFK_deptno1FOREIGNKEY(deptno)REFERENCESscott.dept(deptno))在创建一个表时定义约束【例11-3】验证:Selectconstraint_name,table_name,constraint_type,status,deferrable,deferred,validatedfromdba_constraintswhereowner='SCOTT';11.2管理完整性约束[例11-4]为表employee中ename添加一个惟一性约束SQLaltertableemployeeadd(constraintename_ukunique(ename));[例11-5]为表employee中age添加一个NOTNULL约束SQLaltertableemployeemodify注:此处为modify非addagenotnull;[例11-6]为表employee添加约束,限制员工性别为“男”、“女”SQLaltertableemployeeaddcheck(ssexin(‘男’、‘女’));使用ALTERTABLE语句管理约束11.2管理完整性约束[例11-7]删除约束dept_fkey,这样deptno字段就不再是一个外键了SQLaltertableemployeedropconstraintdept_fkey;使用ALTERTABLE语句管理约束11.2管理完整性约束[例11-8]删除employee表中ename列上的UNIQUE约束SQLaltertableemployeedropunique(ename)使用ALTERTABLE语句管理约束11.3其它方案对象11.3.1索引11.3.2视图11.3.5序列11.3.6同义词11.3.3存储过程11.3.4触发器11.3其它方案对象1、概述在Oracle中,索引是除表之外另一个重要的模式对象,索引主要用于提高表的查询速度。索引与表一样,有独立的数据段存储,并且可以通过设置存储参数控制索引段的盘区分配方式。索引可以由用户显式创建,也可以由Oracle自动创建。11.3.1索引11.3其它方案对象2、使用索引的目的•快速查询•经常在查询中引用索引可以帮助oracle以最快的速度检索数据•惟一值•oracle自动产生索引来实施表中主键的惟一值,也可对任何其他需要惟一值的列(或一组列)使用这一特性11.3其它方案对象3、索引类型在oracle10g中有如下几种可用的索引类型:B-树索引(B-treeindex)位映射索引(Bitmapindex)B-树簇索引(B-treeclusterindex)哈希簇索引(Hashclusterindex)全局和本地索引(Globalandlocalindex)基于函数的索引(Function-basedindex)域索引(Domainindex)常用IndexentryheaderKeycolumnlengthKeycolumnvalueROWIDRootBranchLeafIndexentryB-树索引位图索引29索引与约束Oracle在创建表或修改表的时候,可以为表的列定义约束。如果在表中定义了PRIMARYKEY或UNIQUE约束,Oracle会自动为约束列建立惟一索引。在默认情况下,如果禁用了约束,则相应的索引将被删除;相反,当用户激活约束时,则会自动重新创建相应的索引。11.3其它方案对象30创建索引由于在Oracle数据库中,索引可以拥有它自己的存储空间,不必与相关联的表位于同一个表空间中。因此在创建索引时,用户可使用TABLESPACE子句为索引指定存储空间,如果未使用该子句,则Oracle会自动在用户的默认表空间中创建一个索引段。当索引和相对应的表分别存放在不同的表空间时,可以获取更好的性能。11.3其它方案对象创建索引:指南平衡查询和DML的需要。将其放入单独的表空间。使用统一的extent尺寸:数据块尺寸的5的倍数或表空间的MINIMUMEXTENT的尺寸。对大索引可考虑使用NOLOGGING。•索引的INITRANS参数通常应改比相对应表的高。11.3其它方案对象1、建立B-树索引CREATE[UNIQUE]INDEX[模式.]索引名称ON([模式.])表名称(列名[ASC|DESC][,列名[ASC|DESC]]…)排序方式11.3其它方案对象例11-9:对emp表中的ename列建立索引建立B-树索引SQLCreateUNIQUEindexscott.ename_indexOnscott.emp(ename)SQLCreateindexscott.ename_indexOnscott