数据库系统概论实验八——数据库完整性约束

实验八:数据库的完整性约束

一、实验目的

1.掌握主键约束、外键约束及check约束的用法;
2.掌握默认值约束和默认值对象的应用;
3.掌握用触发器实现参照完整性的方法。

二、实验学时

2学时

三、实验要求

1.了解约束、默认值;
2.了解触发器的定义方法;
3.掌握触发器的编写和运行方法
4.完成实验报告。

四、实验内容

  1. 数据完整性。以实验数据库为基础数据,请使用T-SQL语句完成以下内容,并将SQL语句写在实验报告册中:
    1)将数据库stu的表course的cno字段定义为主键,约束名称为cno_pk;
Use stu
Alter table course
Add constraint cno_pk primary key(con)

2)为表course中的字段cname添加唯一值约束;

Alter table course
Add constrain A_cname unique(cname)

3)对于数据表sc的sno、cno字段定义为外码,使之与表student的主码sno及表course的主码cno对应,实现如下参照完整性:

Alter table SC
Add constraint A_B foreign key (Sno)
References student(Sno)
Alter table SC
Add constraint C_D foreign key(Cno)
References course(Cno)

删除student表中记录的同时删除sc表中与该记录sno字段值相同的记录;

Alter table SC
Add constraint E_F foreign key(Sno)
References student(Sno)
On delete cascade

修改student表某记录的sno时,若sc表中与该字段值对应的有若干条记录,则拒绝修改;

Alter table sc 
Add constraint G_H foreign key(sno)
References student(sno)
On update no action 

修改course表cno字段值时,该字段在sc表中的对应值也应修改;

Alter table sc
Add constraint I_J foreign key(cno)
References course(cno)
On update cascade

删除course表一条记录时,若该字段在在sc表中存在,则删除该字段对应的记录;

Alter table sc
Add constraint K_L foreign key(cno)
References course(cno)
On delete cascade

向sc表添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入;

Alter table sc
Add constraint M_N foreign key(sno)
References student(sno)
On update no action

4)定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三位皆为0;

Alter table student
Add constraint O_P 
Check(sno like'[1-9][0][0][0-9][0-9][0-9][0-9][0-9][0-9]')

5)定义stu数据库中student表中学生年龄值在16~25范围内;

 Alter table student
Add constraint A_Sage
Check (Sage between 16 and 25)

6)定义stu数据库student表中学生年龄值默认值为20;

Alter table student 
Add constraint B_Sage default('20') for Sage

7)修改student表学生的年龄值约束可以为15~30范围内;

Alter table student
Drop constraint A_Sage
Alter table student
Add constraint C_Sage
Check (sage between 15 and 30)

8)删除表course中字段cname的唯一值约束;

Alter table course
Drop constraint A_cname
    
  1. 以实验数据库为基础数据,编写以下触发器并测试。
  1. 为表course建立一个 INSERT触发器,当插入的新行中课程学分(ccredit)的值不是1~6时,就激活该出发器,撤销该插入操作,并使用RAISERROR语句返回一个错误信息。
create trigger course_insert on course for insert
as 
declare @pr_ccredit char(4)
select @pr_ccredit=ccredit from inserted
if @pr_ccredit>7 or @pr_ccredit<1
begin
raiserror('不能插入',16,10)
rollback tran  
End

2)为course表再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激活该触发器级联更新sc表中相关的课程号信息,并使用PRINT语句返回一个提示信息。

create trigger cno_update on course
after update
as
begin
declare @old_cno char(9),@new_cno char(9)
select @old_cno=cno from deleted
select @new_cno=cno from inserted
update sc set cno=@new_cno where cno=@old_cno
End

3)为student表创建DELECT触发器,在删除中的一条记录的同时将sc表中的相应记录也删除。

create trigger sno_delete on student
after delete
as
begin
delete from sc where sno in(select sno from deleted)
End

4)创建INSTEAD OF触发器,当向sc表中插入记录时,先检查sno列上的值在student中是否存在,如果存在执行插入操作,如果不存在则提示“该学生不存在”。

create trigger ttble on sc
instead of
insert 
as
declare @pr_sno char(9)
select @pr_sno = sno from inserted
if @pr_sno not in(select sno from student)
begin
raiserror('该学生不存在!',6,10)
rollback tran
End

5)比较约束与触发器的执行顺序。(在一个表中创建CHECK约束和触发器,然后向表中插入一条不符合约束和触发器的记录,察看谁先发生作用。)
Insert 语句执行时首先验证约束,同时约束本身也有先后顺序
1 、验证非空约束
2 、验证主键约束
3 、验证唯一性约束
再次验证相关 Check
最后执行触发器,如果触发器中也必须保证不违反相关约束和 Check

我觉得很需要这样两个连接🙌🙌🙌🙌:添加链接描述
添加链接描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值