
数据库完整性
2024年9月3日...大约 6 分钟
什么是数据库的完整性
- 防止不合语义的数据进入数据库
什么是完整性控制机制
- 数据模型的组成部分
- 约束数据库中数据的定义
- .
- 检查用户发出的操作是否违背了完整性约束条件
- 在INSERT、UPDATE、DELETE语句执行时进行检查
- 如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性
- 拒绝(NO ACTION)、级联(CASCADE)
完整性约束条件作用的对象
- :对属性的取值类型、范围、精度等的约束条件
- :对元组中各个属性列间的联系的约束
- :对若干元组间、关系集合上以及关系之间的联系的约束
完整性约束条件分类
- 对静态对象的约束是反映数据库状态的合理性的约束
- 对动态对象的约束是反映数据库状态变迁的约束
0x01 实体完整性
****- 若属性A是基本关系R的主属性,则属性A不能取空值
实体完整性实现
- 在CREATE TABLE语句中提供了PRIMARY KEY子句,供用户在建表时指定关系的主码列。
- 在列级使用PRIMARY KEY子句
- 在表级使用PRIMARY KEY子句
例1:在学生选课数据库中,要定义Student表的Sno属性为主码
CREATE TABLE Student
(Sno CHAR(5) primary key ,
Sname VARCHAR(10) ,
Ssex CHAR(2) ,
Sage INT,
Sdept CHAR(2));
例2:要在SC表中定义(Sno, Cno)为主码
CREATE TABLE SC
(Sno CHAR(5) ,
Cno CHAR(1) ,
Grade INT,
primary key (Sno,Cno) );
- 用户程序对主码列进行更新操作时,系统自动进行完整性检查
- 使主属性值为空值得操作
- 使主码值在表中不唯一的操作
- 拒绝操作
0x02 参照完整性
参照完整性规则
- 若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码$K_s$相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
- 或者取空值(F的每个属性值均为空值)
- 或者等于S中某个元组的主码值。
参照完整性实现
例:职工-部门数据库包含职工表EMP和部门表DEPT
- DEPT关系的主码为部门号Deptno
- EMP关系的主码为职工号Empno,外码为部门号Deptno 称 DEPT 为被参照关系或目标关系,EMP 为参照关系
- 外码是否能够取空值:依赖于应用环境的语义
- 实现参照完整性
- 系统提供定义外码的机制
- 定义外码列是否允许空值的机制
例2:学生-选课数据库 Student关系为被参照关系,其主码为Sno。 SC为参照关系,外码为Sno。 若SC的Sno为空值:表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在Grade中,与学校的应用环境是不相符的,因此SC的Sno列不能取空值。
- 出现违约操作的情形
- 删除被参照关系的某个元组(student),而参照关系有若干元组(SC)的外码值与被删除的被参照关系的主码值相同
- 违约反应
- 受限删除(NO ACTION)
- 当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒绝此删除操作
- 级联删除(CASCADE)
- 将参照关系中外码值与被参照关系中要删除元组主码值相对应的元组一起删除
- 置空值删除(NULLIFIES)
- 删除被参照关系的元组,并将参照关系中与被参照关系中被删除元组主码值相等的外码值置为空值。
- 受限删除(NO ACTION)
- 出现违约操作的情形
- 需要在参照关系中插入元组,而被参照关系不存在相应的元组
- 违约反应
- 受限插入(NO ACTION)
- 仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。
- 递归插入
- 首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。
- 受限插入(NO ACTION)
用CREATE TABLE语句在建表时定义用户完整性约束
- 列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个布尔表达式(CHECK)
Constraint <约束名>
[Primary key… | Foreign Key… | Check …]
Alter Table <表名>
Add| Drop Constraint <约束名>
通过触发器来定义复杂的完整性规则
- 定义其它的完整性约束时,需要用数据库触发器(Trigger)来实现。
- 数据库触发器:一类靠事务驱动的特殊过程
- 一旦由某个用户定义,任何用户对该数据的增、删、改操作均由服务器自动激活相应的触发子,在核心层进行集中的完整性控制
CREATE TRIGGER <触发器名>
ON <表名>
FOR {INSERT| DELETE|UPDATE}
AS
<触发动作体>
DROP TRIGGER <触发器名>
例. 计算机系学生成绩不低于60分,低于60分自动赋为60分
Create Trigger chggrade on SC for insert
as
update SC set grade=60 where exists (select * from inserted
where inserted.Sno=SC.Sno and inserted.Cno=SC.Cno
and inserted.grade < 60 )
例. 数学是必修课,所有学生都必须选,学生退学则将成绩置0
create Trigger selcou
on student
for insert
as
insert into SC(Sno,Cno)
select Sno, '2' from inserted
create Trigger sleft
on student for delete
as
update SC set Grade = 0
where Sno in
( select Sno from deleted)
Powered by Waline v3.4.1