一.完整性概述
数据库的完整性是保证数据正确性和一致性的关键。它防止数据库中存在不符合业务逻辑或语义规则的数据,避免错误信息的输入和输出。数据库的完整性和安全性不同,安全性关注的是防止非法用户的访问和恶意操作,而完整性则关注数据内容的正确性。
为了维护数据库完整性,DBMS提供了完整性约束条件的机制,这些约束条件是数据语义的表达,由用户定义,并在数据模式定义时设定为模式的一部分。当用户操作可能违反这些约束时,DBMS会拒绝执行相应的操作。
完整性规则
-
实体完整性:确保每个表都有唯一的主键,用于标识每条记录。
-
参照完整性:确保表间的外键关系正确,外键值必须在参照表的主键中存在或为NULL(如果允许)。
-
用户定义完整性:根据特定的业务规则或政策定义的约束条件,如某字段的值必须在一定范围内。
-
域完整性(列完整性):确保表中每列的值满足特定条件,如数据类型、数据格式或值的范围。
完整性检查
当修改数据库状态的操作(如INSERT、UPDATE、DELETE)发生时,DBMS检查是否违反了完整性约束。
如果操作违反完整性约束,DBMS会拒绝执行该操作并返回错误。
现代DBMS提供工具和方法来定义和自动检查完整性约束。
完整性的重要性
- 确保数据准确性:避免错误数据的输入。
- 实施业务规则:帮助维护特定的业务逻辑和规则。
- 保持数据关系正确性:保持表之间正确的关系。
- 提升数据质量:提高数据的可靠性和信任度。
二.完整性约束
数据库的完整性约束条件是对数据的质量和逻辑正确性的保护。它们在不同级别上施加限制,确保数据的准确性和可靠性。
列级
1. 静态列级约束
这些约束涉及单个列的属性和规则。
- 数据类型约束:指定列的数据类型、长度、单位和精度。
- 数据格式约束:规定列的特定格式,如日期格式或电话号码格式。
- 取值范围或集合约束:限制列的值必须在特定范围或集合内,如年龄在20到55岁之间。
- 空值约束:确定列是否可以接受空值。
- 其他约束:如排序规则或列组合。
2. 动态列级约束
涉及对列定义或值的修改。
- 修改列定义约束:如,更改列是否允许空值。
- 修改列值约束:新值必须符合与旧值的某种关系。
元组级
1. 静态元组约束
元组级约束涉及单个记录内部列值间的关系。
- 列间关系约束:比如,一个元组的还书日期应晚于借书日期。
2. 动态元组约束
涉及对单个记录的修改,应满足某种约束条件。
- 元组修改约束:如,不允许降低特定员工的工资。
关系级
1. 静态关系约束
涉及一个或多个关系内部不同记录间的关系。常见的关系约束有以下四种:
- 实体完整性:确保每个表的主键是唯一的。
- 参照完整性:确保外键值与参照表的主键匹配。
- 函数依赖约束:特定的业务逻辑规则。
- 统计约束:某个字段与一个关系多个元组的统计值之间的关系。如,工资不得高于或低于特定统计值的倍数。
2. 动态关系约束
涉及整个关系或多个关系的状态变化。
- 事务一致性和原子性:保证事务的完整性和不可分割性。
三.完整性控制
数据库完整性控制确保数据的正确性和一致性,防止无效或错误的数据操作。这涉及到定义完整性约束条件、监测用户操作、以及在违反约束条件时采取适当的措施。
1. 完整性约束的定义
完整性控制功能主要包括:
- 定义功能:提供定义完整性约束的机制。
- 检查功能:检查用户操作是否违反完整性约束。
- 反应机制:在操作违反完整性约束时,采取相应措施以保持数据完整性。
2. 违反完整性约束的处理措施
处理违反完整性约束的情况时,DBMS通常采取以下措施:
-
对实体完整性和用户定义完整性规则的违反:通常拒绝执行违反这些规则的操作。
-
对参照完整性的违反:处理方式可能更复杂,包括接受操作并执行附加操作,以维持数据库的正确状态。
-
级联删除:在删除被参照关系的元组时,同时删除参照关系中所有相关元组。
-
受限删除:只有在没有相关元组时才允许删除操作。
-
删除值空置:将相关元组的外码值置为空值。
-
级联修改:同时修改被参照关系中的主码和参照关系中的相关外码值。
-
受限修改:只在没有相关元组时允许修改操作。
-
修改值空置:将相关元组的外码值置为空值。
-
-
外码接受空值:是否接受空值取决于应用环境的语义。