Oracle基础知识第十二讲.ppt
第十二讲第十二讲数据完整性数据完整性二零一零年六月目标目标n学学习此章,需要掌握以下知此章,需要掌握以下知识:n了解数据完整性的概念和作用了解数据完整性的概念和作用n了解完整性了解完整性约束的束的类型型n了解完整性了解完整性约束的工作机制束的工作机制n知道如何管理和知道如何管理和维护数据的完整性数据的完整性n知道如何知道如何查看完整性看完整性约束的相关信息束的相关信息概述概述n数据完整性是指数据数据完整性是指数据库内的数据必内的数据必须遵从的一遵从的一套套预定定义规则。n此此规则是由数据是由数据库管理管理员或或应用程序开用程序开发者确者确定的。定的。n Oracle 使用完整性使用完整性约束防止用束防止用户向数据向数据库的基的基表中插入无效数据。表中插入无效数据。n完整性完整性约束的作用是确保数据束的作用是确保数据库内存内存储的信息的信息遵从一定的遵从一定的业务规则。完整性规则的类型完整性规则的类型n空空规则:定:定义在某一列上的在某一列上的规则,其作用是允,其作用是允许或禁止将要被插入或更新的数据行此列的或禁止将要被插入或更新的数据行此列的值为空空值(null),即没有),即没有值 n唯一列唯一列值:其作用是确保将要被插入或更新的:其作用是确保将要被插入或更新的数据行此列(或列集)的数据行此列(或列集)的值是唯一的是唯一的n主主键值规则:其作用是确保表内的每一数据行:其作用是确保表内的每一数据行都可以由某一个都可以由某一个键值唯一地确定。唯一地确定。完整性规则的类型(续)完整性规则的类型(续)n引用完整性引用完整性规则:其作用是确保任意:其作用是确保任意键值都能都能与相关表的某一与相关表的某一键值(即引用(即引用值)相匹配。)相匹配。n复复杂完整性完整性检查n其作用是依据数据行的列其作用是依据数据行的列值来允来允许或禁止插入,或禁止插入,更新,或更新,或删除此数据行除此数据行如何强制实现数据完整性如何强制实现数据完整性使用完整性约束的好处使用完整性约束的好处n声明即用声明即用n规则集中化集中化 n应用程序开用程序开发效率最大化效率最大化n即即时向用向用户反反馈 n性能性能优势 n数据加数据加载时的灵活性的灵活性n对违反完整性的数据的反完整性的数据的识别 使用完整性约束的影响使用完整性约束的影响n将将带来一定的性能来一定的性能损失失n一般来一般来说,完整性,完整性约束造成的性能束造成的性能损失与失与进行行约束束检查所需所需执行的行的 SQL 语句大体相当句大体相当 非空约束非空约束n默认情况下,表的所有列都允许为空值默认情况下,表的所有列都允许为空值n空值的含义是未输入值。空值的含义是未输入值。n约束要求表列内只能包含非空值。约束要求表列内只能包含非空值。nUNIQUE keyUNIQUE key完整性约束要求列或列集的值唯一,完整性约束要求列或列集的值唯一,数据表任意两行某列或某个列集的值不重复。数据表任意两行某列或某个列集的值不重复。nOracle Oracle 使用索引来强制实现唯一完整性约束使用索引来强制实现唯一完整性约束 。唯一性约束唯一性约束n包含于包含于 PRIMARY KEY PRIMARY KEY 完整性约束定义内的列被称为主键。完整性约束定义内的列被称为主键。n表内的每行数据可以被唯一确定表内的每行数据可以被唯一确定n表内不存在重复的数据行表内不存在重复的数据行主键约束主键约束nOracle Oracle 使用索引来强制实现使用索引来强制实现 PRIMARY KEY PRIMARY KEY 约约束。束。n例如:例如:deptno deptno 列上定义了主键约束,列上定义了主键约束,Oracle Oracle 的实现方式是隐式地创建索引的实现方式是隐式地创建索引 n在此列上创建唯一索引(在此列上创建唯一索引(unique indexunique index)n在此列上定义在此列上定义 NOT NULL constraintNOT NULL constraint(约(约束)束)n隐式创建的索引名称与主键约束名称相同。隐式创建的索引名称与主键约束名称相同。主键约束(续)主键约束(续)n在关系型数据库中,不同的表可以依据其共同的列产在关系型数据库中,不同的表可以依据其共同的列产生关联关系,数据库需要确保数据遵从列关系的规则。生关联关系,数据库需要确保数据遵从列关系的规则。引用完整性规则,就是用于确保列关系的规则。引用完整性规则,就是用于确保列关系的规则。引用完整性约束引用完整性约束引用完整性约束(续)引用完整性约束(续)引用完整性约束的规则引用完整性约束的规则n限制限制:不允不允许对引用引用值进行更新与行更新与删除除n置空置空:当引用当引用值被更新或被更新或删除后,所有受影响的除后,所有受影响的依依赖值都将被都将被赋予一个默予一个默认值。n置默置默认值:当引用当引用值被更新或被更新或删除后,所有受除后,所有受影响的依影响的依赖值都将被都将被赋予一个默予一个默认值。n串串联操作操作:当引用当引用值被更新后,所有受影响的依被更新后,所有受影响的依赖值也将被更新也将被更新为相同的相同的值。当引用数据行。当引用数据行(referenced row)被)被删除后,所有受影响的除后,所有受影响的依依赖数据行(数据行(dependent row)也将被)也将被删除。除。引用完整性约束的规则(续)引用完整性约束的规则(续)n要求数据行满足用户定义的检查条件要求数据行满足用户定义的检查条件n 检查条件检查条件n布尔表达式布尔表达式n子子查询查询,序列序列,SYSDATE,SYSDATE,UIDUID,USER,USERENV USER,USERENV 等等 SQL SQL 函数函数nLEVEL LEVEL 或或 ROWNUM ROWNUM 虚列虚列n多重多重 CHECK CHECK 约束约束n多个,不受限制多个,不受限制n不冲突不冲突check完整性约束完整性约束约束条件的状态约束条件的状态nDISABLE NOVALIDATEDISABLE NOVALIDATE:不:不检查新数据和新数据和现有数据,因此有数据,因此这些数据可能不符合些数据可能不符合约束条件。束条件。nDISABLE VALIDATEDISABLE VALIDATE:如果:如果约束条件束条件处于此状于此状态,则不允不允许对有有约束条件的列束条件的列进行任何修改。行任何修改。nENABLE NOVALIDATEENABLE NOVALIDATE:新数据符合:新数据符合约束条件,但束条件,但现有数有数据据处于未知状于未知状态。nENABLE VALIDATEENABLE VALIDATE:新数据与:新数据与现有数据均符合有数据均符合约束条件。束条件。这是是约束条件的典型状束条件的典型状态和默和默认状状态。约束条件的状态(续)约束条件的状态(续)约束条件检查的设置约束条件检查的设置n可延可延迟的(的(deferrable)与不可延)与不可延迟的(的(not deferrable)n可延可延迟的,指的是提交事的,指的是提交事务处理理时才才检查约束条件。束条件。如果在提交如果在提交时检测到任何到任何违反反约束条件的情况,束条件的情况,则会会回退整个事回退整个事务处理理n不可延不可延迟的,又称的,又称为即即时约束,是在每个束,是在每个DML语句句结束束时强制制执行的。行的。违反反约束条件会束条件会导致致语句的回句的回滚n定定义为“非延非延迟”的的约束条件不能更改束条件不能更改为延延迟的的约束束条件条件约束条件检查的设置(续)约束条件检查的设置(续)n延延迟开始(开始(initially deferred)与立即开始)与立即开始(initially immediate)n延延迟开始,指的是在默开始,指的是在默认情况下,只在事情况下,只在事务处理理结束束时强制使用的制使用的约束条件束条件n立即开始,指的是在默立即开始,指的是在默认情况下,情况下,约束条件必束条件必须用用作即作即时约束,除非另外束,除非另外显示示进行了行了设置置n使用使用set constraints 语句可以句可以对约束条件束条件的的检查进行行设置置约束条件的检查约束条件的检查exceptions表表n表表EXCEPTIONS 记录着任何着任何违反已启用反已启用约束的行束的行的信息的信息n使用使用EXCEPTIONS表表检测违反反约束的数据束的数据:a.如果尚未如果尚未创建建EXCEPTIONS,则通通过运行运行utlexcpt.sql 脚本来脚本来创建例外表。建例外表。SQL?/rdbms/admin/utlexcpt.sql b.执行行带有有EXCEPTIONS 选项的的ALTER TABLE 语句。句。ALTER TABLE table_nameENABLE VALIDATE CONSTRAINT const_nameEXCEPTIONS INTO system.exceptions;Exceptions表(续)表(续)n使用使用EXCEPTIONS表表检测违反反约束的数据束的数据:c.使用使用EXCEPTIONS 上的子上的子查询定位包含无效数据的行定位包含无效数据的行SELECT rowid,FROM table_nameWHERE ROWID in(SELECT row_id FROM system.exceptions)FOR UPDATE;d.纠正正错误。UPDATE table_name SET WHERE rowid=.e.截断截断EXCEPTIONS 表,并重新表,并重新执行行ALTER TABLE 以启用以启用约束。束。TRUNCATE TABLE system.exceptions;ALTER TABLE table_name ENABLE VALIDATE CONSTRAINT const_name EXCEPTIONS INTO system.exceptions;创建约束创建约束n可以在可以在创建表或修改表的建表或修改表的时候候创建建约束束视图描述DBA_CONSTRAINTSALL_CONSTRAINTSUSER_CONSTRAINTS描述约束定义DBA_CONS_COLUMNSALL_CONS_COLUMNSUSER_CONS_COLUMNS描述约束中的列查看约束的信息查看约束的信息总结总结n通通过本章的学本章的学习,应达到达到:n了解数据完整性的概念了解数据完整性的概念n了解完整性了解完整性约束的束的类型型n了解完整性了解完整性约束的工作机制束的工作机制n知道如何管理和知道如何管理和维护数据的完整性数据的完整性n知道如何知道如何查看完整性看完整性约束的相关信息束的相关信息