数据库的完整性是指数据的正确性和相容性
数据的正确性:符合世界语义,反映当前实际状况
数据的形容性:数据的相容性就是指数据库在同一对象在不同关系中的数据是否符合逻辑,可以理解为一致性
数据库管理系统(DBMS)必须实现以下功能:
1.提供定义完整性的约束条件的机制(SQL的DDL语句,立法)
2.提供完整检查的方法(什么时候检查,怎么检查,执行方法)
3.进行违规处理
实体完整性
关系模型的是实体完整性在create table中用primary key定义
对于单一属性构成的码,可以定义为列级约束条件或者表级约束条件;
对于多个属性构成的码,只能采用表级定义:
create table Student(
Sno char(9) primary key, /*在列级定义主码*/
Sname char(20) not null,
Sage int not null
)
-- 或者在表级定义主码
create table Student(
Sno char(2),
Sname char(20) not null,
Sage int not null,
primary key (Sno) /*在表级定义主码*/
)
create table SC(
Sno char(9) not null,
Cno char(4) not null,
primary key(Sno, Cno) /*这种只能在表级定义主码*/
)
实体完整性检查和违约处理
用 primary key 短语定义了关系的主码之后,每当用户程序对基本表插入一条记录或对主码进行更新操作时,关系数据库管理系统DBMS将按照定义的实体完整性规则进行自动检查:
参照完整性
定义参照完整性
关系模型的参照完整性在create table中使用 foreign key 定义哪些为外码,用references短语指明这些外码参照哪些表的主码。
create table SC(
Sno char(9) not null,
Cno char(4) not null,
Grade smallint,
primary key(Sno, Cno), /*在表级定义实体完整性*/
foreign key(Sno) references Student(Sno), /*表级定义参照完整性*/
foreign key(Cno) references Course(Cno), /*在表级定义参照完整性*/
)
参照完整性检查和违规处理
对被参照表和参照表进行增删修改有可能会破坏参照完整性,必须进行修改以确定两个表的形容性
解释:
create table SC(
Sno char(9),
Cno char(4),
Grade smallint,
/*表级实体完整性,Sno和Cno都不能为空*/
primary key(Sno, Cno),
/*表级定义参照完整性*/
foreign key(Sno) references Student(Sno)
on delete cascade
on update cascade,
foreign key(Cno) references Course(Cno)
on delete no action
on update cascade
)
用户定义的完整性
用户定义的完整性就是指针对某一具体应用的数据必须满足的语义要求。
属性上的约束条件
在create table中定义属性的同时,可以同时定义约束条件,包括:
列值非空not null
列值唯一unique
检查列值是否满足一个条件表达式check语句
create table Student(
Sno char(9) unique not null,
Sname char(8) not null,
Ssex char(2) check (Ssex in ('男', '女')),
);
在插入新的元组或者修改元组时,如果不满足属性上的约束条件,操作将被拒绝执行。
元组完整性
与属性上约束条件的定义类似,在create table 语句中可以用check短语定义元组上的约束条件,即元祖级的限制,同属性值限制相比,元祖级可以设置不同属性之间的取值的相互约束条件。
/*当性别是男时,姓名不能以Ms.开头(What???)*/
create table Student(
Sname char(8) not null,
Ssex char(2) not null,
check(Ssex == '女' or Sname not like 'Ms.%')
)
触发器
定义:用户定义在关系表上的一类由事件驱动的特殊过程,
一旦定义,触发器将保存在数据库服务器中。任何用户对表的增、删、改、查操作均由服务器自动激活的触发器,在关系数据系统核心层进行集中的完整性控制。触发器类似于约束但是比约束更加灵活。
定义触发器
触发器又叫做事件-条件-动作规则:当特定的系统事件发生时,对规则的条件进行检查,条件成立则执行规则中的动作。
建立触发器的一般格式:
create trigger <触发器名>
{before | after} <触发事件> on <表名>
referencing new|old row as <变量>
for each {row | statement}
[when <触发条件>] <触发动作体>
注解:
表的拥有者才能在表上创建触发器,数量受关系数据库管理系统限制
触发器名可以包含或者不包含模式名
统一模式下,触发器名必须是唯一的,并且触发器名和表名要在同一模式下
触发器只能建立在基本表上,不能建立在视图上
触发事件可以是delete、update、insert等或是这几个事件的组合
触发器可以分为 行级触发器 和语句级触发器
如果没有触发条件,动作体在触发器出发后立即执行,如果有触发条件,动作体在条件为真的情况下执行
样例:单独记录成绩增加超过10%的学生:
create trigger SC_T
after update of Grade on SC
referencing
oldrow as oldtuple,
newrow as newtuple
for each row
when (newtuple.Grade >= oldtuple.Grade * 1.1)
insert into SC_T (Sno, Cno)
values (oldyuple.Sno, oldtuple.Cno);
激活触发器
触发器激活时的执行顺序:
该表上的before触发器
激活触发器的SQL语句
该表上的after触发器
如果存在多个before(after)触发器,遵循先创建先执行的原则。
删除触发器
drop trigger <触发器名> on <表名>;