6.1数据库完整性概述
1.数据库的完整性是防止数据库中存在不符合语义的数据和不正确的数据,它的防范对象是不合语义的不正确的数据。
2.数据的安全性主要是保护数据库,防止恶意的破坏和非法的存取,它的防范对象是非法用户和非法操作。
3.数据库的完整性是指数据的正确性和相容性
4.DBMS必须提供三种机制:提供定义完整性约束条件的机制,提供完整性检查的机制,进行违约处理的机制
5.数据库完整性对于数据库应用系统非常关键,作用有如下几个方面
- 数据库完整性是能够防止合法用户使用数据库时向数据库中添加不合语义的数据
- 利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率
- 合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能
- 在应用软件的功能测试中,晚上的数据库完整性有助于尽早发现应用软件的错误
6.数据库完整性约束可以分为6大类:
列级静态约束,元组级静态约束,关系级静态约束,列级动态约束,元组级动态约束,关系级动态约束
6.2数据库完整性定义和检查
1.实体完整性规则
主码必须唯一且主码的各个属性都不能为空值
2.参照完整性规则
外码或者取空值(要求外码的每个属性均为空值),或者等于被参照关系中主码的某个值
3.用户定义完整性规则
属性的取值应当满足用户定义的约束条件
4.定义实体完整性和实体完整性检查
①对单属性构成的码有两种说明方法,一种是列级约束条件,另一种是定义为表级约束条件。
②实体完整性检查
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
5.定义参照完整性以及参照完整性检查
①定义参照完整性
②参照完整性检查:必须进行检查保证两个表的相容性
6.定义用户定义的完整性与用户定义的完整性检查
1.定义用户定义的完整性
2.属性上约束条件的定义和检查:在create table中定义属性的同时,可以根据应用要求定义属性上的约束条件,如定义列值的非空,列值唯一,检查列值是否满足某个条件等
3.元组上约束条件的定义和检查:元组级的约束条件可以设置不同属性之间的取值的相互约束条件
6.3完整性约束命名子句
要为约束指定名称
6.4触发器
触发器是用户定义在关系表上的一类由事务驱动的特殊过程,触发器创建之后将被保存在数据库服务器中。当用户对表进行增删改操作的时候,服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制
1.after触发器
是在触发它的操作(如insert,update,delete)之后触发当前所创建的触发器,如果触发的操作失败,则此触发器不会执行。
2.before触发器
是在触发它的操作(insert,update,delete)之前触发当前所创建的触发器,然后执行触发的操作,触发器先于触发的操作执行,用于对触发器的操作数据进行前期判断,按情况修改数据。
3.定义触发器
create trigger <触发器名>
{before|after} <insert|delete|update> on <表名>
for each {row|statement}
<触发体>
①只有创建表的用户才可以在表上创建触发器,并且一个表只能创建一定数量的触发器。
②触发器名可以包含模式名,也可以不包含模式名,同一模式之下触发器必须是唯一的。
③触发器只能定义在基本表上,不能定义在视图上。
④触发器可以是insert,delete,update,也可以是几个事务的组合。
⑤触发器按照触发动作的间隔尺寸可以分为行级触发器(for each row),和语句级触发器(for each statement)
⑥触发器既可以是一个匿名过程块,也可以是对已创建存储过程的调用,还可以是一个SQL语句。
4.激发触发器
触发器的执行是由触发器事件激活,并由数据库服务器自动执行的。
5.删除触发器
Drop trigger <触发器名> on<表名>;
6.5完整性约束和触发器实践
1.完整性约束实践
①主键约束:唯一标识该表中的每条信息
③外键约束:通常和主键约束一起使用,用来确保数据的一致性
③唯一约束(unique):唯一约束在一个表中可以有很多个,并且设置唯一约束的列允许有空值。
④检查约束:用来检查数据表中字段值是否有效的一个手段
⑤非空约束(not null):约束表中的字段不能为空
⑥默认值约束(default):约束当数据表中某个字段不输入值的时候,自动添加已经设置好的值
2.触发器实践
1.创建before类型触发器:
create trigger 触发器名
before insert on (table名)
for each row
set 创建条件
2.创建after类型触发器:
create trigger 触发器名
after insert on 表名
for each row
insert into 表名
条件