数据完整性概述
数据库的完整性是指数据库中数据的正确性和相容性。数据库的完整性可以通过以下几个方面来保证:
- 实体完整性:确保每个实体都有一个唯一的标识符,且每个实体的属性都具有准确的值。
- 参照完整性:确保在不同表之间的关系是正确的,即外键引用的主键值必须存在于引用表中。
- 域完整性:确保数据的取值范围是合法的,即数据的值必须符合定义的数据类型和约束条件。
- 用户定义的完整性:根据用户定义的规则和约束条件,确保数据的正确性和一致性。
通过以上几个方面的保证,数据库可以保持数据的完整性,从而提高数据的质量和可靠性。
数据库完整性约束条件分为六类:
(1) 静态列约束。是对一个列的取值域的说明。
(2) 静态元组约束。就是规定元组的属性组值的限定,以及规定属性之间的值或结构的制约关系。
(3) 静态表级约束。指一个关系各个元组间或若干关系间存在的联系或约束。
(4) 动态列约束。是修改列定义或列值时应满足的约束条件。
(5) 动态元组约束。是指修改元组时,元组中各个字段间需要满足的约束条件。
(6) 动态表级约束。是加在关系变化前后状态上的限制条件。
约束的分类
被约束的数据对象而言,完整性约束又可以分为如下四种类型:
- 类型/域约束,(用户自定义)
- 属性约束,(用户自定义)
- 关系约束,说明关系的合法取值。(实体完整性/用户自定义)
- 数据库约束(参照完整性)
约束的状态
- 静态约束
- 动态约束
DBMS对约束的支持
....
实体完整性
确保每个实体都有一个唯一的标识符,且每个实体的属性都具有准确的值。
违反实体完整性规则的操作
- 插入重复的实体数据(插入新元组)
- 更新实体标识符,使其与其他实体的标识符重复
- 删除必要的实体数据,将导致实体完整性规则的违反,因为关联实体将无法找到对应的实体。
- 插入空值或非法值
参照完整性
参照完整性是数据库中的一种完整性约束,用于确保在不同表之间的关系是正确的和一致的。参照完整性通常通过外键来实现,外键是一个表中的字段,它包含另一个表中的主键值,用来建立表与表之间的关系。
参考答案:若属性(或属性组) F是关系R的外码,(1分)它与基本关系S的主码相对应,(1分)那么,关于R中每个元组在F上的值必须为空或S中某元组的主码值。 (1分)
违反参照完整性规则的操作
- 插入不存在的外键值
- 更新外键值为不存在的值
- 删除关联表中的主键值而未处理外键引用
违反参照完整性规则可能导致数据不一致性和错误。
参照完整性策略
- 级联操作(CASCADE):
- 设置空值(SET NULL):关联关系不存在,设置空值。
- 设置默认值(SET DEFAULT):类似于空值,可以自行设置默认值。
- 拒绝操作(NO ACTION):
- 受限(RESTRICT) :受限策略要求在参照关系中插入元组时,如果被参照关系中不存在相应的元组,则拒绝插入操作。
- 递归插入(CASCADE):递归插入策略要求在参照关系中插入元组时,如果被参照关系中不存在相应的元组,则会自动插入相应的元组,以满足参照完整性的要求。
受限(RESTRICT)和拒绝操作(NO ACTION)虽然在处理插入操作时的行为相似,但它们在其他操作(如更新和删除)中可能会有不同的行为。
删除操作:在删除操作中,受限和拒绝操作也可能会有不同的行为。受限策略可能会限制删除操作,而拒绝操作则可能允许删除操作,但不会触发级联操作。
用户自定义完整性
用户根据特定需求和业务规则定义的数据完整性约束。
实现方式
- 触发器(Triggers):
就是一类靠事件驱动的特殊过程,(1分)当对相关的表作INSERT、 UPDATE或DELETE操时,(1分)这一过程被隐式地执行。(1分)
- 存储过程(Stored Procedures):
一组预先编译好的 SQL 语句集合,存储在数据库中并可被多次调用。存储过程通常用于执行特定的任务或操作,可以接受参数、执行逻辑判断、包含循环和条件语句等,使得数据库操作更加灵活和高效。
- 自定义约束(Custom Constraints):
属性约束
用于限制表中特定属性(字段)取值范围或满足特定条件的规则。
常见的数据库属性约束包括以下几种:
- NOT NULL约束
- UNIQUE约束
- PRIMARY KEY约束
- FOREIGN KEY约束
- CHECK约束,指定属性值必须满足特定的条件或表达式。
关系约束
关系约束是数据库中用于维护表与表之间关系的规则,确保数据的完整性和一致性。关系约束通常用于定义表之间的关系,包括主键和外键之间的关系,
常见的关系约束包括以下几种:
- 主键约束(Primary Key Constraint
- 外键约束(Foreign Key Constraint)
- 唯一约束(Unique Constraint)
- 检查约束(Check Constraint)
数据库断言约束
断言约束是在数据库中定义的一种逻辑条件,它必须为真(True)才能保证数据的完整性。
例如:
CREATE ASSERTION check_salary
CHECK (salary > 0);
上面的示例创建了一个名为check_salary的断言约束,要求salary字段的值必须大于0。当插入或更新数据时,数据库会自动检查该条件是否满足,如果不满足则阻止操作的执行