5 数据库完整性

数据库完整性

  1. 完整性指数据的正确性和相容性
  2. 完整性:为了防止数据库中存在不符合语义的数据,不正确的数据
  3. 安全性:保护数据库恶意破会和非法存取
  4. 维护完整性,数据库系统必须实现 如下功能
    1. 提供定义完整性的约束条件机制:由sql数据定义语言实现,作为数据库模式的一部分存入数据字典
    2. 完整性检查的方法: 在insert ,update,delete语句执行后开始检查,也可以在事务提交时检查
    3. 违约处理: 发现用户的操作违背了完整性约束条件将采取一定的动作,如拒绝(no action)操作或(cascade)级联其他操作

sql 语言如何实现完整性控制的方法

5. 1 实体完整性

5.1.1定义实体完整性

多个属性构成的码只能定义为表级约束
create table student (sno char(9)) primary key, //列级约束
sname char20) not null

);或者
create table student (sno char(9),sname char(20) not null

primary key(sno) // 表级约束

create table student (sno char(9) not null,sname char(20) not null,
…, priamry key(sno,sname));

5.1.2实体完整性检查和违约处理

实体完整性自动检查:
1. 主码值是否唯一:全表扫描非常费时间,建立主码B+树索引
2. 主码的属性是否为空

5.2 参照完整性

5.2.1 定义参照完整性

关系模型的参照完整性在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)

5.2.2 参照完整性检查和违约处理

参照完整性
将两个表连接起来,增删改破坏参照完整性
不一致发生时,解决策略:

  1. 拒绝执行(no action) 默认策略
  2. 级联操作
  3. 设置为空值
    外码能否接收空值
    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)
    on delete cascade
    on update cascade
    foreign key(cno) references course(cno)
    on delete no action
    on update cascade

5.3 用户定义完整性

5.3.1 属性上的约束条件

  1. 属性上的约束条件的定义
  • 列值非空
  • 唯一
  • 检查列值满足一个条件表达式
    举例:
    create table sc
    (cno char(9) not null unique ,
    ssex char(2) check(ssex in(‘男’,‘女’),
    sage smallint check (sage>10 and sage <50)
    );
  1. 约束条件的检查和违约处理

5.3.2 元组上的约束条件

  1. 元组上约束条件定义
    例子:
    create table student
    (sno char(9)
    sname char(8) not null,
    ssex char(2),
    sage smallint,
    primary key(sno),
    check (ssex='女‘ or name not like ‘MS.%’)
    );

  2. 约束条件的检查和违约处理

5.4完整性约束命名字句

在 create table 的时候可以插入constraint

5.6断言

创建断言
create asserttion
1:create aasertion <断言名> >check子句>
限制每一门课程最多最多60名学生选修:
create assertion asse_sc——cnumi
check (60>=all(select count()
from sc
group by cno)
);
限制每个学期每一门课程最多60名学生选修
alter table sc add team date;
create assertion asse_sc_cnum2
check(60>=all(select count(
) from sc group by cno,team))’
2:删除断言的语句格式
电容屏assertion<断言名>

触发器

触发器使用户定义在关系表上的一类由事件驱动的特殊过程

5.7.1定义触发器

触发器:事件-条件-动作
建立触发器的格式
create trigger <触发器名>
{before|after}<触发器事件> on<表名>
referencing new|old row as <变量名>
for each {row|statement}
[where <触发器条件》】《触发器动作》
行级和语句级触发器
举例:
对表sc的grade属性进行修改,分数增加10%,则此次操作记录在另一个表sc_u(sno,cno,oldgrade,newgrade)oldgrade 修改前的分数,newgrade修改后的分数

create trigger sc_t
after update on gradde on sc
referencing
olldrow as oldtuple
newrow as newtuple
for each row
where(newtuple.grade>1.1*outtuple.grade)
insert into sc_u(sno,cno,oldgrade,newgrade)
values(oldtuple.sno,oldtuple,con,oldtuple.grade.newtuple.grade)

激活触发器,before,after ,触发器的事情了语句

删除触发器:drop trigger 名 on 表名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值