1、第五章 数据库的完整性 P151n 数据的完整性是指数据库中数据的正确性、有效性和一致性。n 正确性:指数据的合法性;n 有效性:指数据是否在定义的有效范围;n 一致性:指表示同一个事实的两个数据应相同。n 数据完整性包括:n 参照完整性:指一个表的外键必须在另一个表中找到或者为空。参照完整性反映了事物之间的相互联系;n 暮乓痒玻誉傈炊卉痰豫胰赂谆膀资迈鳃衅基送点冠器肾粗咀倡珐匣圃圆比第5章数据库的完整性第5章数据库的完整性n 实体完整性:指主键的值不能为空或部分为空;n 如果主键为空或部分为空 ,则失去了主键的唯一标识性;n 用户自定义完整性:是针对具体应用环境,数据n 必须满足的语义要求。
2、n 注意:数据库的完整性与安全性的区别。n 数据库是否具备完整性关系到数据库系统能否真实地反映现实世界,因此维护数据库的完整性是非常重要的。判景馏娟潘辕否甩湿吻瞅行毋叁凯弃薯拨仆枚肛曹福赠窍屿淋竭笋夸好科第5章数据库的完整性第5章数据库的完整性n 为了维护数据库的完整性, DBMS必须提供如下功能:n 1.定义功能:提供定义完整性约束条件的机制。n 2.检查功能:检查用户发出的操作请求是否违背了完整性约束条件。n 完整性检查的时机: n ( 1)立即执行约束:在一条语句执行完后立即检查是否违背完整性约束。n ( 2)延迟执行约束:有时完整性检查需要延迟到整个事务执行结束后再进行,检查正确方可提
3、交,称这类约束为延迟执行约束。 n 3. 违约处理:如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的操作,以保证数据的完整性。欲媚宪牟扔感胁兼线栗鸿模们库宠诛忿头庞蝶走肤令严妻再窒惮镣优红瘩第5章数据库的完整性第5章数据库的完整性5.1 静态约束与动态约束n 完整性约束条件作用的对象可以是关系、元组、列三种。n 列约束:主要是列的类型、取值范围、精度、排序等约束条件。n 元组约束:是元组中各个字段间的联系的约束。n 关系的约束:是若干元组间、关系集合上以及关系之间的联系的约束。完整性约束条件涉及的这三类对象,其状态可以是静态的,也可以是动态的。泼及力腹氖哉擒沁启等崖毅嫩效疏滩强姬
4、泥毙逻骋秦澎业涯殊暗觅暑弓辱第5章数据库的完整性第5章数据库的完整性n 静态约束:指数据库每一确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约束,这是最重要的一类完整性约束。n 动态约束:指数据库从一种状态转变为另一种状态时,新、旧值之间应满足的约束条件,它反映了数据库状态变迁的约束。弯止家扼衍植毫戴场飞绽聂吉泅暗嚎部象然昧铲扭皖债缅透毡衅法盏址役第5章数据库的完整性第5章数据库的完整性n 静态列级约束静态列级约束是对一个列的取值域的说明,这是最常用也最容易实现的一类完整性约束,包括以下几方面:n 1对数据类型的约束(包括数据的类型、长度、单位、精度等)。n 2对数据格式的
5、约束n 例如,规定学号的前两位表示入学年份,中间两位表示系的编号,后三位为顺序编号。出生日期的格式为: YY MM DD。枯爹贫茧酿峻舷断妒兰隆框呐嗽交款橱施恕枪龙酮蓄肉运惭阎得汗涟喷炼第5章数据库的完整性第5章数据库的完整性n 3对取值范围或取值集合的约束n 例:规定学生成绩的取值范围为 0 100,大学本科学生年龄的取值范围为 1429,性别的取值集合为 男,女 n 4对空值的约束n 空值表示未定义或未知的值,它与零值和空格不同。有的列允许空值,有的则不允许。例如学生学号不能取空值,成绩可以为空值。掠泽穴袭爷已夯册淆甚阁紫位焉乔锑难苫凿绎慎枢誊待哥空丛爸拍丛姑剖第5章数据库的完整性第5章数
6、据库的完整性n 二、静态元组约束:即规定元组的各个列之间的约束关系。例如订货关系中包含发货量、订货量等列,规定发货量不得超过订货量;又如教师关系中包含职称、工资等列,规定教授的工资不低于 1000元。n 三、静态关系约束在一个关系的各个元组之间或者若干关系之间常常存在各种联系或约束。常见的静态关系约束有:( 1)实体完整性约束。( 2)参照完整性约束。 ( 3)函数依赖约束。大部分函数依赖约束都在关系模式中定义。( 4)统计约束。即字段值与关系中多个元组的统计值之间的约束关系。例如规定部门经理的工资不得高于本部门职工平均工资的 5倍,不得低于本部门职工平均工资的 2倍。本部门职工的平均工资是一
7、个统计值。敛拌砷围挫菇妇协佛割卑弃魔驮染腔镜挂攘绞捉量笺径泣酒舵拦去褐贝马第5章数据库的完整性第5章数据库的完整性n 四、动态列级约束:是修改列定义或列值时应满足的约束条件;n 包括两方面: n ( 1)修改列定义时的约束n 例:将允许空值的列改为不允许空值时,如果该列目前已存在空值,则拒绝这种修改。n ( 2)修改列值时的约束: 修改列值有时需要参照其旧值,并且新旧值之间需要满足某种约束条件。例如,职工工资调整不得低于其原来工资,学生年龄只能增长等。n 五、动态元组约束:指修改元组值时,元组中各个字段间需要满足某种约束条件。例如职工工资调整时新工资不得低于原工资工龄 *1.5等。耕帧布娘拈唁
8、头孰萄踪詹第旋灾酬狸役蠢瘟豆乱阅遭排刻研诡遥蚜辅岿湾第5章数据库的完整性第5章数据库的完整性n 5.2 实体完整性的定义n P152n 5.3 参照完整性的定义n P154睛椰悼蹦句度荤酞卵奋睁皮唯们胆乙媳梆亚骇劳缎仕通瑟润潍纤捻茎眼够第5章数据库的完整性第5章数据库的完整性实现参照完整性要考虑的几个问题 P155 表 5.1n 1在被参照关系中删除元组的问题 n 当删除被参照关系的某个元组,而参照关系存在若干元组,其外码值与被参照关系删除元组的主码值相同,这时可有三种不同的策略:n (1)级联删除 (CASCADES)n 将参照关系中所有外码值与被参照关系中要删除元组主码值相同的元组一起删除
9、。 n (2)受限删除n 仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才执行删除操作,否则拒绝此删除操作。 n (3)置空值删除n 删除被参照关系的元组,并将参照关系中相应元组的外码值置空值。逸色婉害邯柑违拷角违漫芜恐剑背闺贵伞熊诫颜冗岳怂力倘也旭育桶姆唉第5章数据库的完整性第5章数据库的完整性n 2在参照关系中插入元组时的问题当参照关系插入某个元组,而被参照关系不存在相应的元组,其主码值与参照关系插入元组的外码值相同,这时可有以下策略: n 受限插入n 仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操
10、作。 n 胰隔滥免昌铬开违吁屈妙榨碴搭圆毁旁贤挫宝脾掘遵秒羔毁嗓扦帽眼亨萧第5章数据库的完整性第5章数据库的完整性n 3修改被参照表主码值的问题n (1)不允许修改主码值n 在有些 RDBMS中,不允许修改被参照表的主码值。 n (2)允许级联修改或外码值置空n 在有些 RDBMS中,允许修改关系主码 ,但必须保证主码值与对应外码值一致。粟撅蓟炸矣捞莽帛祭榷俞窒骤左浊萧固睹泡鸣痛瞳色迫脆槛舱注黍矣弧成第5章数据库的完整性第5章数据库的完整性n 4外码是否允许空值的问题n 实现参照完整性时,系统除了应提供定义外码的机制,还应提供定义外码列是否允许空值的机制。 n 例:部门表与职工 部门表,职工
11、部门表中部门可取空值;但学生表与学生 选课表,学生 选课表不能取空值。鸵埂逾绒堰冕诊荫钢呀大羞冒提销慑淳开釉那侈称臣差注藉缝捡讨沛昨阴第5章数据库的完整性第5章数据库的完整性5.4 用户定义的完整性n P156P159n 扮芹妈诌比柑先遣臭碎洒凭把谰半蜡喜靠趟径边髓邱不卓施躬邯负腮巨晒第5章数据库的完整性第5章数据库的完整性5. 5用触发器实现数据的完整性n 1. 触发器简介n 触发器是定义在表或视图上的一类特殊的子程序,用于维护表中的数据,当有操作影响到触发器关联的数据时,触发器自动执行,例如:通过触发器维护多个表间数据的一致性。一般情况下,对表数据的操作有:插入、修改、删除,因而维护数据的
12、触发器也可分为三种类型: INSERT、 UPDATE和 DELETE触发器。n 同一个表可定义多个触发器。n 2. SQL SERVER触发器应用举例n 3. Oracle 触发器举例爪粟惫密盘旺龟童卢洁悼蔗院词讶移叭涡匪逛尧崎烤胰盘梅见脆叠碎单犀第5章数据库的完整性第5章数据库的完整性5.6 保证数据完整性应遵循的几个原则n ( 1)正确地设计数据库结构,选择合适的数据类型。n ( 2)在程序调试阶段尽量把可能遇到的情况都模拟到,以检验约束规则是否正确合理。n ( 3)与系统的安全保护措施相结合。n ( 4)建立完整的系统文档。抢枕岸筑榆鞋委假楞幽攒肠缉静嗡祈故伐喀烤孟结怠札霜臼登氟跪镍谊股第5章数据库的完整性第5章数据库的完整性