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 <触发条件>] <触发动作体> -
定义触发器的语法说明
-
表的拥有者才可以在表上创建触发器
-
触发事件
INSERT
DELETE
UPDATE
UPDATE OF <触发列, ...>
进一步指明修改哪些列时激活触发器
-
触发器类型
- 行级触发器
FOR EACH ROW
- 语句级触发器
FOR EACH STATEMENT
- 注意区别
- 行级触发器
-
触发条件
- 只有当触发条件为真时触发动作体才执行
-
触发动作体
-
-
例子
激活触发器
-
触发器的执行是由触发事件激活的, 并由数据库服务器自动执行
-
一个数据表上可能定义了多个触发器, 则触发顺序为
- 执行该表上的
BEFORE
触发器 - 激活触发器的SQL语句
- 执行该表上的
AFTER
触发器
- 执行该表上的
删除触发器
-
DROP TRIGGER <触发器名> ON <表名>