05.数据库完整性
提供定义完整性约束条件的机制
提供完整性检查的方法
违约处理
实体完整性
实体完整性定义
- 
关系模型的实体完整性
- 设置主码 
PRIMARY KEY 
 - 设置主码 
 
实体完整性检查和违约处理
- 
完整性检查的内容
- 检查主码值是否唯一
 - 检查主码的各个属性是否为空
 
 - 
检查主码值方法
- 全表扫描
 - B+数索引
 
 
参照完整性
参照完整性定义
- 
设置外码
FOREIGN KEY 
参照完整性检查和违约处理
- 
修改参照表 – 违约处理为 拒绝
 - 
修改被参照表 – 违约处理为 拒绝/级联删除/设置为空值
 - 
设置外码时可在后面显示指定违约处理方式
1
2
3FOREIGN KEY (列名) REFERENCES <表名>(列名)
ON <操作类型> CASCADE # 级联处理
ON <操作类型> NO ACTION # 拒绝 
用户定义的完整性
属性上的约束条件
- 
属性上约束条件的定义
- 列值非空 
NOT NULL - 列值唯一 
UNIQUE - 检查列值是否满足一个条件 
CHECK 
 - 列值非空 
 
元组上的约束条件
- 
元组上约束条件的定义
- 表级上使用 
CHECK 
 - 表级上使用 
 
完整性约束命名子句
- 
CONSTRAINT <约束名> <约束条件> - 
修改表中的完整性限制
- 使用 
ALTER TABLE语句修改表中的完整性限制 - 可以先删除原来的约束条件, 再增加新的约束条件
 
 - 使用 
 
断言
- 
创建断言的语句格式
CREATE ASSERTION <断言句> <CHECK 子句>- 
<CHECK 子句>中的约束条件与WHERE 子句的条件表达式类似 
 - 
 - 
删除断言
DROP ASSERTION <断言名>- 
开销较大
 
 - 
 
触发器
用户定义在关系表上的一类由事件驱动的特殊过程
- 
触发器保存在数据库服务器中
 - 
任何用户对表的增删改查操作均由服务器自动激活触发器
 
定义触发器
- 
事件 - 条件 - 动作
 - 
语句格式为
1
2
3
4
5
6CREATE TRIGGER <触发器名>
[BEFORE|AFTER] <触发事件> ON <表名>
REFERENCING
NEW|OLD ROW AS <变量>
FOR EACH [ROW|STATEMENT] # 触发器类型
[WHEN <触发条件>] <触发动作体> - 
定义触发器的语法说明
- 
表的拥有者才可以在表上创建触发器
 - 
触发事件
INSERTDELETEUPDATEUPDATE OF <触发列, ...>进一步指明修改哪些列时激活触发器
 - 
触发器类型
- 行级触发器 
FOR EACH ROW - 语句级触发器 
FOR EACH STATEMENT - 注意区别
 
 - 行级触发器 
 - 
触发条件
- 只有当触发条件为真时触发动作体才执行
 
 - 
触发动作体
 
 - 
 - 
例子
 
激活触发器
- 
触发器的执行是由触发事件激活的, 并由数据库服务器自动执行
 - 
一个数据表上可能定义了多个触发器, 则触发顺序为
- 执行该表上的 
BEFORE触发器 - 激活触发器的SQL语句
 - 执行该表上的 
AFTER触发器 
 - 执行该表上的 
 
删除触发器
- 
DROP TRIGGER <触发器名> ON <表名> 









