5.1数据库完整性
数据库完整性的两个要素
-
数据的正确性:数据符合现实世界语义,反应当前实际状况
-
数据的相容性:同一对象在不同关系表中的数据时符合逻辑的
学生学号一定唯一 | 正确性 |
---|---|
性别只能是男或者女 | 正确性 |
本科生年龄为14~50的整数 | 正确性 |
学生的院系必须是学校已经成立的,课程必须是学校已经开设的 | 相容性 |
5.2实体完整性
-
实体完整性(主键不能重复+主属性非空)
-
表级约束条件:定义在表的后面
-
列级约束条件:定义在列的后面
-
单属性的码两种定义都可以,多属性的码只能定义为表级约束条件
-
违反实体完整性:拒绝
-
DBMS自动建立的主索引:稀疏索引,类似分块查找的索引
5.3参照完整性
定义:一个表的属性要参照另一个表中对应属性的值
优先级:被参照表大于参照表,这样理解即可理解这张表,默认全部为拒绝
显示说明参照完整性,在表级约束条件后面加上ON DELETE CASCADE
等说明
5.4用户定义的完整性
方式一:在定义表的时候自定义完整性,有表级约束方式和列级约束条件(在定义属性的后面加上CHECK
子句)
方式二:使用完整性约束命名子句
CONSTRAINT <完整性约束条件名><完整性约束条件>
<完整性约束条件>
包括:NOT NULL, PRIMARY KEY , CHECK等短语
修改表中的约束:ALTER TABLE ADD(DROP) CONSTRAINT <约束名> <约束条件>
用户定义的完整性只能先删后加,不能修改
5.5断言 ASSERTION
- 用途:断言语句,制定更加一般性的约束(例如设计多个表或聚集操作的比较复杂的完整性约束)
- 违反处理:拒绝
- 若断言很复杂,则检测和维护的开销很高,使用时应该注意
- 语句格式
- 创建:
CREATE ASSERTION <断言名><CHECK子句>
- 删除:
DROP ASSERTION <断言名>
- 创建:
//限制数据库课程每门课程最多60名学生选修
CREATE ASSERION ASSE_SC_CNUM1
CHECK (60 >= ALL(select count(*) from SC group by cno))
5.6触发器 Trigger
- 定义:用户定义在关系表上的一类由事件驱动的特殊过程,触发器保存在数据库服务器中,任何用户的对表的增、删、改操作均由服务器自动激活相应的触发器
- 表的拥有者或DBA才能在表上创建触发器,谁拥有谁能删除
- 触发器名和表名必须在同一模式下,一个数据库中触发器的名字是唯一的
- 触发器只能定义在表上,不能定义在视图上
- 触发器种类
- 行级触发器:ROW,对每一行执行,可以使用NEW和OLD引用值
- 列级触发器:STATEMENT,只执行一次,对单一元组执行,不能引用值
- 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化
5.7存储过程 Procedure
- 存储过程是存储在服务器上的一组预编译的SQL语句
- 每个存储过程执行时都向调用方返回一个整数,即返回代码;如果没有显示设置返回代码的值,则返回代码为0表示存储过程成功执行
- 存储过程类似C语言中函数,可以主动调用,有返回值,被预编译