完整性概述
数据库的完整性是指数据库的正确性、一致性、相容性
正确性:数据库的数据符合语义约束
一致性:数据间的逻辑关系是正确的,从一个一致性状态转移到另一个一致性状态
相容性:同一事物的两个数据应当是一致的
约束的分类
从约束的状态分类:
可以分为静态约束和动态约束
静态约束:数据库正确状态的约束
动态约束:数据库从一种正确状态转移到另一种状态的约束
实体完整性
关系的主码唯一并且不能取空值
会破坏实体完整性的几种操作
1、向表中插入新元组会破坏实体完整性
2、修改元组的主码可能破坏实体完整性
3、违约处理,DBMS自动检查并且拒绝所有导致破坏实体完整性的任何插入和修改
参照完整性
参照完整性是对外码取值的约束
外码的取值要么是其参照的表的主码的取值要么是空值(外码建立了不同关系的联系)
破坏参照完整性的几种情况
1、向参照关系中插入新元组
2、删除被参照关系中的元组
3、修改参照关系外码上的值
4、修改被参照关系上主码的值
违约处理:
1、拒绝
2、置空值
3、置默认值
4、级联
用户自定义的完整性
实体完整性和参照完整性是所有关系都必须遵守的,被称为关系的不变性
用户自定义的完整性可以分为属性级的、关系级的、数据库级的
属性级的
定义在列级上的属性约束CHECK约束、NULL约束、UNIQUE约束
关系级的
表级上的CHECK约束,涉及多个属性
数据库级的
涉及多个关系的约束被称为数据库级的约束
断言Assertion是一种命名约束,他表达了数据库必须满足的逻辑状态
断言的创建
CREATE ASSERTION <断言名> CHECK (<约束条件>) [<约束性质>]
约束条件可以是涉及数据库对象的布尔表达式也可以是SELECT语句
约束性质可以是NOT DEEDERRABLE(不可延迟的)或DEEDERRABLE(可延迟的),缺省时为不可延迟的(也就是说是约束立即检查)
eg:
约束“任何部门经理的工资不超过其所在部门平均工资的10倍”涉及上述两个关系,可以为它创建一个断言,该约束等价于不存在一个部门经理,他的工资高于他所在部门平均工资的10倍“
CREATE ASSERTION SalaryConstraint CHECK
(NOT EXISTS
(SELECT * Departments D, Employeess E
WHERE D.Mrgno = E.Eno AND
Salary > 10 *(SELECT AVG(Salary)
FROM Employees
WHERE Dno = D.Dno)))
断言被创建后,只有不违背断言的数据库更新才被允许,如果我们修改经理的工资,只有在满足上述断言,即工资不超过该部门平均工资的10倍的情况下才允许被更新
断言的删除
如果没有其他数据库对象的定义依赖断言可用
DROP ASSERTION <断言名>
触发器
CREATE TRIGGER <触发器名> <触发时间> <触发事件>
ON <表名>
[REFERENCING <旧/新值别名>. ...., <旧/新值别名>]
[FOR EACH{ROW | STATEMENT}]
[WHEN(<触发条件>)]
<被触发的SQL语句>
REFERENCING子句创建一些过渡变量用来存放表T和表T的行更新前的旧值和更新后的新值。
<旧/新值别名>
OLD [ROW] [AS] <变量>:创建行过渡变量<变量>存放表T的行更新前的旧值
NEW [ROW] [AS] <变量>:创建行过渡变量<变量>存放表T的行更新后的新值
OLD TABLE [AS] <变量>:创建表过渡变量<变量>存放表T的行更新前的旧值
NEW TABLE [AS] <变量>:创建表过渡变量<变量>存放表T的行更新前的新值
FOR EACH ROW:定义行级触发器
FOR EACH STATRMENT:定义语句级触发器
WHEN子句定义触发条件缺省时为无条件触发
<被触发的SQL语句>
形式
BEGIN ATOMIC
<可执行的SQL语句>;
<可执行的SQL语句>;
<可执行的SQL语句>;
END
删除触发器
DROP TRIGGER <触发器>