9 数据的完整性
当数据库中的数据被Insert,Update,Delete语句修改时,所存数据的完整性可能以不同的形式丢失。例如:
非法数据被添加到数据库中,如学生选修了不存在的课程。
现存的数据被修改成不正确的值,如重新安排一教师到不存在的单位。
由于系统错误或功能崩溃以使数据库的修改丢失。
修改被部分实现。
9.1 什么是数据的完整性
数据完整性 (data integrity)
存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。
对表进行计划有两个重要步骤:标识列的有效值确定如何强制列中的数据完整性。数据完整性有四种类型:
实体完整性
域完整性
引用完整性
用户定义完整性
9.2 实体完整性
实体完整性将行定义为特定表的唯一实体。实体完整性强制表的标识符列或主键的完整性(通过索引、UNIQUE 约束、PRIMARY KEY 约束或 IDENTITY 属性)。
9.3 域完整性
域完整性是指给定列的输入有效性。强制域有效性的方法有:限制类型(通过数据类型)
、格式(通过 CHECK 约束和规则)或可能值的范围(通过 FOREIGN KEY 约束、CHECK 约束、DEFAULT 定义、NOT NULL 定义和规则)。
9.4 引用完整性
在插入、更新或删除记录时,引用完整性保持表之间已定义的关系。
引用完整性基于外键与主键之间或外键与唯一键之间的关系(通过 FOREIGN KEY 和 CHECK 约束)。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。
insert语句字段顺序
9.4.1 引用完整性的问题
数据库四种类型的更新(包括插入、删除和修改)可能破坏数据库中父/子关系的引用完整性(参照统一)。
外键/主键参照
插入新子行(在子表中,这里如教师)。
当INSERT语句添加一新行到子表(教师)时,其外键(单位代码)值必须与父表(单位)中的主键的其中之一匹配。如果外键值不匹配任何主键,那么插入的行将使数据库损坏,这是因为这里将有一个表无父表。值得注意的是在父表中插入行不引起这个问题,仅仅变成一个没有子表的父表。
更新子行外键(在子表中,这里如教师)。
这个问题不同于前者,如果外键(单位代码)被UPDATE语句修改,那么其新值必须与父表(单位)中的一个主键值(单位)匹配。否则,更新行将成为一“孤行”。
删除父行(在父表中,这里如单位)。
如果具有一个或多个子表(在教师表中)的父表(单位)的行被删除,那么子行将变成“孤行”。在这些行中外键(单位代码)值不再与父表中的任何主键(单位)匹配。值得注意的是从子表中删除一行不会引起这个问题,这样仅使父表的行在删除之后少一个子行。
更新父行主键(在父表中,这里如单位)。
这个问题与前者不同,如果父表(单位)行的主键(单位)被修改,那么所有当前子表中的行变
成“孤行”,这是因为它们的外键不匹配任何一个主键值。
9.4.2 删除和更新规则
数据库中对于每一个外键创建的父/子关系,SQL2标准允许你指定一个相关联的删除规则一个相关联的更新规则
9.4.2.1 删除规则
删除规则向DBMS指示当用户企图删除父表的行时应该做的工作。以下这四个删除规则可以被指定。
RESTRICT(NO ACTION)
该规则防止你从父表中删除有许多子行的行。企图删除那样父行的DELETE语句将被拒绝,并出结错误信息。因此,从父表中删除的行被限制到那些没有子行的行中。
应用到前图中,这个规则可被总结为“你不能删除一个有教师的单位”。
CASCADE
该规则向DBMS指示当一父行被删除时,其所有的子行应该自动地从子表中删除。
应用到前图中,该规则可被总结为“删除一单位将自动地删除该单位的所有教师”。
SET NULL
该规则向DDMS指示当一父行被删除时,其所有子行中的外键值将自动被赋予NULL值。因此,从父表中删除引起子表中所选字段赋予NULL值的更新。
应用到前图中,该规则可总结为“如果一单位司被删除,那么其中的教师当前所在单位为未知”。
SET DEFAULT
该规则向DBMS指示当一父行被删除时,其所有的子行中的外链位将自动被赋予缺省的值。因此,从父表中删除引起子表中所选字段赋缺省值的更新。
应用到前图中,该规则可被总结为“如果一单位被删除,那么其教师当前所在单位为教师表定义中指定的缺省单位。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。