文章目录
- 实体完整性
- 参照完整性
- 用户定义的完整性
- 完整性约束命名子句
- 域中的完整性限制
- 触发器
- 激活触发器
- 删除触发器
- 小结
什么是数据库的完整性 ➢ 数据的正确性和相容性 ➢ 防止不合语义的数据进入数据库。 ➢ 完整性:真实地反映现实世界
数据的完整性和安全性是两个不同概念
- 数据的完整性 ➢防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据 ➢防范对象:不合语义的、不正确的数据
- 数据的安全性 ➢保护数据库防止恶意的破坏和非法的存取 ➢防范对象:非法用户和非法操作
为维护数据库的完整性,DBMS必须:
- 提供定义完整性约束条件的机制
- 提供完整性检查的方法
- 违约处理
完整性约束条件定义
- 完整性约束条件:数据模型的组成部分约束数据库中数据的语义。
- DBMS应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中。
完整性控制机制 检查用户发出的操作请求是否违背了完整性约束条件
违约反应 如果发现用户的操作请求使数据违背了完 整性约束条件,则采取一定的动作来保证 数据的完整性。
实体完整性
一、实体完整性定义
- 关系模型的实体完整性 ➢ CREATE TABLE中用PRIMARY KEY定义
- 单属性构成的码有两种说明方法 ➢ 定义为列级约束条件 ➢ 定义为表级约束条件
- 对多个属性构成的码只有一种说明方法 ➢ 定义为表级约束条件
【例1】 将Student表中的Sno属性定义为码 (1)在列级定义主码
代码语言:javascript复制CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));
(2)在表级定义主码
代码语言:javascript复制CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
二、实体完整性检查和违约处理
- 插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括: ➢ 检查主码值是否唯一,如果不唯一则拒绝插入或修改。检查记录中主码值是否唯一的一种方法是进行全表扫描。 ➢ 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
参照完整性
一、参照完整性定义
- 关系模型的参照完整性定义 ➢ 在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码 ➢ 用REFERENCES短语指明这些外码参照哪些表的主码
【例2】 例如,关系SC中一个元组表示一个学生选修的某门课程的成绩, (Sno,Cno)是主码。Sno,Cno分别参照引用Student表的主 码和Course表的主码 定义SC中的参照完整性
代码语言:javascript复制CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /*在表级定义实体完
整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*在表级定义参照完整性*/
);
二、参照完整性检查和违约处理
1. 参照完整性违约处理 ➢ 拒绝(NO ACTION)执行:默认策略 ➢ 级联(CASCADE)操作 ➢ 设置为空值(SET-NULL) 对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
【例3】 显式说明参照完整性的违约处理示例
代码语言:javascript复制CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno)
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/ );
用户定义的完整性
- 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求
- RDBMS提供,而不必由应用程序承担
一、属性上的约束条件的定义
CREATE TABLE时定义 ➢ 列值非空(NOT NULL) ➢ 列值唯一(UNIQUE) ➢ 检查列值是否满足一个布尔表达式(CHECK)
二、属性上的约束条件检查和违约处理
- 插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足
- 如果不满足则操作被拒绝执行
三、元组上的约束条件的定义
- 在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
- 同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件
四、元组上的约束条件检查和违约处理
- 插入元组或修改属性的值时,RDBMS检查元组上的约束条件是否被满足
- 如果不满足则操作被拒绝执行
完整性约束命名子句
- CONSTRAINT 约束
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
- 修改表中的完整性限制 使用ALTER TABLE语句修改表中的完整性限制
域中的完整性限制
SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件。
触发器
- 触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程 ➢ 由服务器自动激活 ➢ 可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力
一、定义触发器 1. CREATE TRIGGER语法格式
代码语言:javascript复制CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>] <触发动作体>
2.定义触发器的语法说明 1)创建者:表的拥有者 2)触发器名 3)表名:触发器的目标表 4)触发事件:INSERT、DELETE、UPDATE 5)触发器类型: ➢行级触发器(FOR EACH ROW) ➢语句级触发器(FOR EACH STATEMENT) 6)触发条件 ➢ 触发条件为真 ➢ 省略WHEN触发条件 7) 触发动作体 ➢ 触发动作体可以是一个匿名PL/SQL过程块 ➢ 也可以是对已创建存储过程的调用
【例4】 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
代码语言:javascript复制CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/*触发事件是插入或更新操作*/
FOR EACH ROW /*行级触发器*/
AS BEGIN /*定义触发动作
体,是PL/SQL过程块*/
IF (new.Job='教授') AND (new.Sal < 4000) THEN
new.Sal :=4000;
END IF;
END;
激活触发器
- 触发器的执行,是由触发事件激活的,并由数据库服务器自动执行
- 一个数据表上可能定义了多个触发器 同一个表上的多个触发器激活时遵循如下的执行顺序: (1) 执行该表上的BEFORE触发器; (2) 激活触发器的SQL语句; (3) 执行该表上的AFTER触发器
删除触发器
- 删除触发器的SQL语法:
DROP TRIGGER <触发器名> ON <表名>;
- 触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除
小结
- 数据库的完整性是为了保证数据库中存储的数据是正确的
- RDBMS完整性实现的机制 ➢ 完整性约束定义机制 ➢ 完整性检查机制 ➢ 违背完整性约束条件时RDBMS应采取的动作
写在最后: 本数据库专栏是由爱吃老谈酸菜的DV一同完成的,博客链接在主页友链,是我的好哥们✈ Name:风骨散人,目前是一名双非在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!名字的含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 …”