数据库-安全性约束触发器(条件限制,修改表结构,级联删除,级联更新)

本文详细介绍了如何在SQL数据库中使用约束确保数据一致性,包括成绩表的分数范围限制,学生表性别字段的规范,以及如何通过触发器实现级联删除和更新,确保跨表数据的一致性。同时,文章还探讨了如何自动调整系部表中的学生人数字段,以反映学生表的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建成绩表,学号、课程号是外键,分数默认为0,限制在0-100之间

Create table 成绩表
(
学号 char(9) NOT NULL,
课程ID integer NOT NULL,
分数 smallint NULL  default 0,
)
Insert into 成绩表 (学号,课程ID,分数) values ('151011001',2,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011001',1,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011001',3,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011003',2,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011008',2,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011008',7,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011008',1,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011028',2,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011028',1,0)
Insert into 成绩表 (学号,课程ID,分数) values ('151011066',2,0)

alter table 成绩表
add constraint ck_成绩
check (分数>=0 and 分数<=100)

在这里插入图片描述
2. 修改学生表结构,使其性别字段只能输入男或女两个字

alter table 学生表
add constraint ck_性别
check (性别='男' or 性别='女')

//测试代码
update 学生表 set 性别='空' where 学号='151011001'

在这里插入图片描述
3. 删除学生表的记录时,级联删除成绩表中的相关记录

create trigger tri_score
on 学生表
for delete
as
  if(select COUNT(*)from deleted)=1
  delete 成绩表 
  where 学号=(select 学号 from deleted)
  
//测试代码
delete 学生表 where 学号='151011001'

在这里插入图片描述
4. 修改学生表的学号时,级联修改成绩表中的学号

create trigger tri_ab
on 学生表
for update
as
  if update(学号)
  begin
  update 成绩表
  set 学号=i.学号
  from 成绩表 br , deleted d , inserted i
  where br.学号=d.学号
  end

//测试代码
update 学生表 
set 学号='151011004'
where 学号='151011003'

在这里插入图片描述
5. 系部表中增加学生人数字段,默认值为0


update 系部表 set 学生人数=0

在这里插入图片描述
6. 创建触发器tri_student ,其功能是当学生表增加一条记录时,相关系部的学生人数要加1;当学生表删除一条记录时,相关系部的学生人数要减1;当学生变更系部时,转出系部的学生人数要减1,转入系部的学生人数要加1。

Create trigger tri_student
on 学生表 
for insert ,delete
as
begin
  if(select COUNT(*) from inserted )=1
     update 系部表 set 学生人数 = 学生人数+1
	 where 系部ID = (select 系部ID from inserted)

  if(select COUNT(*) from deleted )=1
     update 系部表 set 学生人数 = 学生人数-1
	 where 系部ID = (select 系部ID from deleted)
end

//测试代码
delete 学生表 where 学号='151011023'
insert into 学生表 values('151011029','林青春','女','12312312345','2000-01-01',1,49)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值