数据库完整性

完整性概述

数据库的完整性是指数据库的正确性、一致性、相容性
正确性:数据库的数据符合语义约束
一致性:数据间的逻辑关系是正确的,从一个一致性状态转移到另一个一致性状态
相容性:同一事物的两个数据应当是一致的
约束的分类

从约束的状态分类:
可以分为静态约束和动态约束
静态约束:数据库正确状态的约束
动态约束:数据库从一种正确状态转移到另一种状态的约束

实体完整性

关系的主码唯一并且不能取空值
会破坏实体完整性的几种操作
1、向表中插入新元组会破坏实体完整性
2、修改元组的主码可能破坏实体完整性
3、违约处理,DBMS自动检查并且拒绝所有导致破坏实体完整性的任何插入和修改

参照完整性

参照完整性是对外码取值的约束
外码的取值要么是其参照的表的主码的取值要么是空值(外码建立了不同关系的联系)
破坏参照完整性的几种情况
1、向参照关系中插入新元组
2、删除被参照关系中的元组
3、修改参照关系外码上的值
4、修改被参照关系上主码的值
违约处理:
1、拒绝
2、置空值
3、置默认值
4、级联
2.png

用户自定义的完整性

实体完整性和参照完整性是所有关系都必须遵守的,被称为关系的不变性
用户自定义的完整性可以分为属性级的、关系级的、数据库级的

属性级的

定义在列级上的属性约束CHECK约束、NULL约束、UNIQUE约束
3.png

关系级的

表级上的CHECK约束,涉及多个属性
4.png

数据库级的

涉及多个关系的约束被称为数据库级的约束
断言Assertion是一种命名约束,他表达了数据库必须满足的逻辑状态

断言的创建

CREATE ASSERTION <断言名> CHECK (<约束条件>) [<约束性质>]

约束条件可以是涉及数据库对象的布尔表达式也可以是SELECT语句
约束性质可以是NOT DEEDERRABLE(不可延迟的)或DEEDERRABLE(可延迟的),缺省时为不可延迟的(也就是说是约束立即检查)
eg:
5.png
约束“任何部门经理的工资不超过其所在部门平均工资的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 <触发器>
posted @   cxy8  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示