5.1实体完整性
5.1.1定义实体完整性
5.1.2实体完整性检查和违约处理
5.2参照完整性
5.2.1定义参照完整性
5.2.2参照完整性检查和违约处理
5.3用户定义的完整性
5.3.1属性上的约束条件
5.3.2元组上的约束条件
5.4完整性约束命名字句
5.5断言
5.6触发器
5.6.1定义触发器
5.6.2激活触发器
5.6.3删除触发器
5.1实体完整性
数据库的完整性integrity是指数据的正确性和相容性
数据的正确性是指数据是符合现实世界语义、反映当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的
什么是正确性?
学生属性组{学号,性别}中的性别只能是男或者女,不能是不男不女,这就是正确性
什么是相容性?
学生属性组的学号在专业课程属性组{专业课程号,学号}也是表达的是学号,不会变成其他班级座号等信息,这就是相容性
为了维护数据库的完整性,数据库管理系统必须能够实现如下功能:
1提供定义完整性约束条件的机制
完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件。SQL标准提供了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性。
2提供完整性检查的方法
数据库管理系统中检查是否满足完整性约束条件的机制称为完整性检查
3进行违约处理
如果系统发现了用户违法了完整性约束条件,将会拒绝执行该操作**(NO ACTION)或级联(CASCADE)**执行其他操作
关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户和应用提供一致的数据库完整性
5.1.1定义实体完整性
关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。
对单属性构成的码有两种说明方法:
定义为列级约束条件
定义为表级约束条件
对多属性构成的码只有一种说明方法:
定义为表级约束条件
例如:定义为列级约束条件
定义为表级约束条件
5.1.2实体完整性检查和违约处理
关系数据库管理系统将按照实体完整性规则(在笔记二中有介绍)自动进行进检查,包括:
(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改
(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
5.2参照完整性
5.2.1定义参照完整性
关系模型用参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语来指明这些外码参照哪些表的主码
例如
5.2.2参照完整性检查和违约处理
参照完整性是把两个表中相应元组联系起来,对被参照表和参照表进行增、删、改操作时可能破坏参照完整性,必须进行检查以保证两个表的相容性
例如
当上述的不一致发送时,系统可以采用以下策略加以处理
(1)拒绝no action执行
不运行执行该操作
(2)级联cascade操作
删除或修改所有不一致的元组
(3)设置为空值
设置为空值需要考虑外码是否接受空值
例如在学生属性组中学号为主码,在专业课程属性组中学号为外码,能不能把学号设置为空值呢?答案是不可以,**为什么?**因为学号同样是专业课程属性组的主属性,没了学号,即表示没有这个学生或者这个学生没有选这个专业课,这是与学校设定不符合的
5.3用户定义的完整性
用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求
5.3.1属性上的约束条件
1属性上约束条件的定义
在CAREATE TABLE中定义属性的同时,可以设置条件约束,包括:
①列值非空(NOT NULL)
②列值唯一(UNIQUE)
③检查列值是否满足一个条件表达式(CHECK)
2属性上约束条件的检查和违约处理
当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行
5.3.2元组上的约束条件
1元组上约束条件的定义(和属性上约束类似,用CHECK)
2元组上约束条件的检查和违约处理
当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行
5.4完整性约束命名字句
SQL在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名
1完整性约束命名子句
CONSTRAINT<完整性约束条件名><完整性约束条件>
<完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语等
例如
2修改表中的完整性限制
可以用ALTER TABLE语句修改
例如
5.5断言
在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。断言创建后,任何对断言中所涉及的关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行
1创建断言的语句格式
CREATE ASSERTION<断言名>
例
2删除断言的语句格式
DROP ASSERTION<断言名>
5.6触发器
触发器trigger是用户定义在关系表上的一类由事件驱动的特殊过程
激发触发器后触发器会保存在服务器中,任何用户的增删改操作都会激活相应的触发器。
5.6.1定义触发器
触发器又叫做事件-条件-动作(event-condition-action)规则
SQL使用CREATE TRIGGER来建立触发器,其语法格式一般为
下列是有关部分语法的详细说明(什么是什么,做什么的)
例子如下
5.6.2激活触发器
触发器的执行是由触发事件激活,并由数据库服务器自动执行的。在触发器激活时遵循如下的执行顺序:
①执行该表上的BEFORE触发器
②激活触发器上的SQL语句
③执行该表上的AFTER触发器
激活before触发器还是比较抽象的,笔者在这里对学习笔记进行理解性的补充。因为创建了触发器后这个触发器就存在服务器里,所以当进行增删改等操作之前时,会自动激活触发器。**之前时不就没操作吗,它怎么触发?**请注意,触发事件是insert/delete/update,可以这样理解,你在修改某个东西之后,还没执行操作(比如计算机的一个属性窗口,你输入数据之后,你要点击应用,它才会执行操作,也就是你输入数据还没有点击应用的时候),它就会触发了
5.6.3删除触发器
删除触发器的SQL语法如下:
DROP TRIGGER<触发器名>ON<表名>
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除
笔记使用教材:《数据库系统概论》 王珊 萨师煊 编著
视频课:中国大学MOOC 中国人民大学 数据库系统概论