数据完整性与约束:
一: 数据不完整性:
1: 实体(行)信息导致的不完整:
一个编号分配给两个人的情况.知道了 ID (如“1”),也不能知道到底是哪个用户,他的姓名是什么(到底是张三,还是李四)
2、 域(列)信息导致的不完整: (一颗老鼠屎,坏了一锅粥):
(由于录入有误, 某 ID 的出生年月是1980-01-02,) 与其它人都不是一个世纪的人,根
本就不是一个有效的,符合逻辑的出生日期. ,如果数据库中有这样的不符合逻辑的数据存在,导致我们在统计用户的年龄信息时得到的统计数据将不可信
3、 表间引用导致不完整:
在Users 表中的第“5”行数据(姓名为赵六),指定的部门编号(DeptID)为“8”,部分编号等于“8”的是哪个部门呢,在此没有这样一个部门,也就是说在数据库中,体现的这一信息是错误的,不可信的.
因此:一个表中引用 到另一个表中没有的(不完整的)数据的这种形式叫不符合引用完整性。
4: 业务规则导致的不完整
举例:
业务规则: 一个部门的领导只能是本部门的人员担任,或者是院机关的人来兼任
在此规则下,我们如果一个部门表中部门 2 的领导的编号(ManagerID)为“3”,但编号是“3”的用户根本就不是编号为“2”的剖门,也不是规则允许的编号为“3”的院机关,在此是编号为“1”的部门的.
二: 在设计数据库时有一个原则:
“宁可数据不能进入数据库,也要保证进入数据库的数据都是正确的”,的确这样,一个错误的数据,宁可让它不要进入数据库中,因为那会导致数据库中其它数据的不可信,只有这样才能充分保证数据库中数据的正确性。
三: 解决数据完整性的方式与约束:
1、 各完整性之间的关系
完整性可以分如下几种类型: 实体完整性,域完整性,引用完整性,自定义完整性.他们的逻辑关系图:
2、 约束:
(1). 约束主要在数据进入到数据库之前进行的一系列的校验,主要有如下几种情况会触发这种数据的检验:在数据插入、数据更新、数据删除时.
(2). 从实现方式分,约束分为两种:
列约束: 用来限定表中每行数据中的某一列的数据是否正确.
表约束: 用来限定表中每行数据中的一列或者多列是否正确
四: 完整性的实施:
1、 实体完整性:
数据库表的一行,代表一个唯一的一个实体,实体完整性就是要确保将行定义为特定
表的唯一实体。也就是要有可以唯一标识一行的列存在,在SQL Server 中,可以采用如下
方式来保证:
(1). 主键约束:
(2). 标识列: 可以做为主键的列
(3). 唯一约束与唯一索引
2、 域完整性:
域完整性主要是保证输入到指定列中的数据的有效性, 主要有如下方式:
(1) 指定相应的数据类型与宽度
(2) 非空约束
(3) 默认值
(4) Check 约束
3. 引用完整性:
由于表间引用而出现的数据不完整的情况, 在数据库系统中,主要通过外键约束来实现:
注意:
(*). 外键所参照的列只能是主键或者侯选键,对于普通的列不能作为外键参照列。
(*). 选键是指具备主键的功能,可以唯一确定一行(也就是说这一列没有重复
值),但没有被指定为表的主键,而是在该列上创建了唯一索引或者唯一性约
束的列称为侯选键
(1). 在删除主键表中一行数据时,如果主键表中的一行数据( 例如 DeptID = 3 )被外键表中数据引用,那么在直接删除 DeptID = 3 时,就会报错. 呢么如何做呢 ?
有两种方式:
第一: 将外键表中 DeptID = 3 的所有行全部删除
第二: 在删除表 DeptID = 3 之前,先将外键表中相应的DeptID列值设置为 NULL 值.
(2) 指定了“级联更新相关的字段”后,在需要修改主键列信息时,数据库管理系统会自动修改外键列中的相应的数据,如果指定了“级联删除相关的记录”,在删除主键表中一行数据时外键表中的相关数据行也一起被删掉.
注意:
(1)、 在创建外键约束时虽然可以指定不对“Insert 和Update 强制关系”,但一般不建
议这样做,因为这样就失去了外键应有的作用。
(2)、 如果删除主键表中的一行数据时需要按照前面介绍的第二种办式处理,即在删
除主键表中的一行时,先将外键表中的外键列设置为NULL 的情况.( 以后补上)
4 自定义的完整性
用户定义完整性使您得以定义不属于其它任何完整性分类的特定业务规则。所有的完
整性类型都支持用户定义完整性(CREATE TABLE 中的所有列级和表级约束、存储过程和
触发器)。