数据库完整性

文章详细阐述了数据库完整性的概念,包括实体完整性(主键约束),参照完整性(外键约束)以及用户自定义完整性。此外,介绍了断言作为高级的约束机制,用于确保数据库满足特定的逻辑状态,并展示了创建和删除断言的SQL语句。触发器也在文中提及,作为在数据修改时执行特定操作的一种方式。
摘要由CSDN通过智能技术生成

完整性概述

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

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

实体完整性

关系的主码唯一并且不能取空值
会破坏实体完整性的几种操作
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 <触发器>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值