实验四 数据库的完整性.docx
- 文档编号:13353852
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:26
- 大小:925.43KB
实验四 数据库的完整性.docx
《实验四 数据库的完整性.docx》由会员分享,可在线阅读,更多相关《实验四 数据库的完整性.docx(26页珍藏版)》请在冰点文库上搜索。
实验四数据库的完整性
实验四:
数据库的完整性
一、实验目的
1.熟悉主键约束、外键约束、空值、惟一约束的使用方法;
2.掌握默认值约束和默认对象的使用方法;
3.掌握check约束及规则的使用方法;
4.掌握触发器的概念、创建、修改和删除方法;
5.了解inserted和deleted的作用及数据的引用;
6.掌握各种触发器的工作过程。
二、实验环境
SQLServer企业版
三、实验学时
2学时
四、实验内容及步骤
(一)创建学生课程数据库和表
Createdatabasestu_tri
Go
usestu_tri
go
createtables(
snochar(5)notnull,
snamechar(10),
ssexchar
(2),
sageint,
sdeptchar(10),
ssum_credittinyint)
go
createtablec(
cnochar(5)notnull,
cnamechar(10),
ccredittinyint)
go
createtablesc(
snochar(5)notnull,
cnochar(5)notnull,
gradetinyint)
go
(二)主键约束
--1.学生表
--
(1)主键的定义
altertablesaddconstraints_pkprimarykey(sno)
go
--
(2)主键约束的违约检查和处理
insertintosvalues('95001','李莹','女',21,'计科',0)
insertintosvalues('95001','章张','男',22,'计科',0)
--修改学号为,再次插入数据
insertintosvalues('95002','章张','男',22,'计科',0)
--(3)依次输入多个学生的记录
insertintos
values
('95003','陈华','女',22,'计科',0),
('95004','吴华义','男',23,'计科',0),
('95005','刘冠章','男',22,'计科',0),
('95006','蒋婷','女',22,'网络',0),
('95007','邱蔚六','男',21,'网络',0),
('95008','王德柱','男',22,'网络',0),
('95009','秦频','女',21,'网络',0),
('95010','程少根','男',21,'网络',0)
--2.课程表c
--
(1)主键的定义
altertablecaddconstraintc_pkprimarykey(cno)
--
(2)主键的检查和处理(省)
--(3)录入数据
insertintoc
values
('00001','计算机导论',2),
('00002','高级语言',2),
('00003','离算数学',3),
('00004','数据结构',3),
('00005','c#',2),
('00006','面向对象',2),
('00007','数据库原理',3),
('00008','操作系统',3)
--3.学生选课表
--
(1)主键的定义
altertablescaddconstraintsc_pkprimarykey(sno,cno)
go
--
(2)主键约束的检查及处理
insertintoscvalues('95001','00001',90)
go
insertintoscvalues('95001','00001',86)
Go
--(3)录入数据
insertintosc
values
('95001','00002',86),
('95001','00003',92),
('95001','00004',76),
('95001','00005',86),
('95002','00001',86),
('95002','00002',80),
('95002','00003',81),
('95003','00001',88),
('95003','00002',68),
('95004','00001',96),
('95005','00001',69)
(三)参照完整性
--1.定义学生选课表的学号为外键
altertablescaddconstraintsc_fkforeignkey(sno)referencess(sno)
go
altertablescaddconstraintsc_fk_1foreignkey(cno)referencesc(cno)
go
--2.参照完整性约束的检查
--
(1)向学生选课表中插入数据—学号外键的检查
insertintoscvalues('95100','00001',90)
go
--
(2)向学生选课表中插入数据—课程号外键的检查
insertintoscvalues('95006','10000',90)
go
--(3)被参照表数据变化:
删除学生表的某一个学生
--1)删除学生选课表中的外键sc_fk
altertablescdropsc_fk
go
--2)重新定义学生表的外键sc_fk及违约处理机制
altertablescaddconstraintsc_fk_sno
foreignkey(sno)referencess(sno)
ondeletecascade
onupdatecascade
go
--3)查询学生选课表
select*fromsc
--4)删除学生表学号为95003的学生
deletefromswheresno='95003'
go
--5)再次查询学生选课表
select*fromsc
go
--更新学生表中学号为的学生学号为-级联更新
updatessetsno=95105wheresnolike'95005'
go
--查询学生选课表查看学生的学号是否改为
select*fromsc
--(四)用户定义完整性(省略非空约束)
--1.唯一性约束(学生姓名惟一)
(1)约束的定义
altertablesaddconstraints_sname_uniqueunique(sname)
(2)约束的检查和处理
insertintosvalues('96001','李莹','女',26,'信管',0)
go
2.检查约束
(1)约束的定义
altertablesaddconstraints_c1check(sage>=12andsage<=35)
(2)约束的检查及处理
insertintosvalues('96001','金林','男',9,'信管',0)
go
3.默认约束
--
(1)约束的定义
altertablesaddconstraints_def1default'女'forssex
(2)约束的检查及处理
insertintos(sno,sname,sdept,ssum_credit)values('96002','胡华林','信管',0)
这时没有给性别赋值,但该学生的性别取了默认值“女”
(五)触发器
--1.insert触发器
--
(1)触发器的定义:
--当向sc表中插入一个学生的成绩时,将s表中该学生的总学分加上添加的课程的学分。
CREATETRIGGERsc_tri_ins
ONscAFTERINSERT
AS
BEGIN
DECLARE@snochar(5),@cnochar(5)
DECLARE@xftinyint
SELECT@sno=sno,@cno=cnofrominserted
SELECT@xf=ccreditFROMcWHEREcno=@cno
UPDATEsSETssum_credit=ssum_credit+@xf
WHEREsno=@sno
PRINT'修改成功'
END
(2)触发器的验证
insertintoscvalues('95006','00001',80)
2)查询学生表
select*froms
从图中可以看出,学生表中学生‘李莹’的学号改为“95001”
3)查询学生选课表
select*fromsc
--2.delete触发器
--()触发器的定义
--在删除s表中的一条学生记录时将sc表中该学生的相应记录也删除。
CREATETRIGGERs_delete_tri
ONsAFTERDELETE
AS
BEGIN
DELETEFROMsc
WHEREsnoIN(SELECTsnoFROMdeleted)
END
--1)查询学生表s
select*froms
--2)查看“刘冠章”的选课记录,学号为95105
select*fromsc
--3)在学生表中删除学号为“95105”的学生记录
deletefromswheresnolike'95105'
--4)查看sc表学号为“”的选课信息
select*fromscwheresnolike'95105'
--3.update触发器
--
(1)触发器的定义
--创建触发器,当修改s表中的学号时,同时也要将sc表中的学号修改成相应的学号
--(假设s表和sc表之间没有定义外键约束)
CREATETRIGGERs_update_tri
ONsAFTERUPDATE
AS
BEGIN
DECLARE@old_numchar(5),@new_numchar(5)
SELECT@old_num=snoFROMdeleted
SELECT@new_num=snoFROMinserted
UPDATEscSETsno=@new_numWHEREsno=@old_num
END
--
(2)触发器的验证
1)UPDATEsSETsno='95100'WHEREsno='95001'
2)查询学生表
select*froms
从图中可以看出,学生表中学生‘李莹’的学号改为“95100”
3)查询学生选课表
select*fromsc
从图中可以看出,学生选课表中学生‘李莹’的学号改为“95100”
4.Insteadof触发器
在stu_tri数据库中创建视图stu_view,包含学生学号、专业、课程号、成绩。
该视图依赖于表s和sc,是不可更新视图。
可以在视图上创建INSTEADOF触发器,当向视图中插入数据时分别向表s和sc插入数据,从而实现向视图插入数据的功能。
(1)首先创建视图:
createviewstu_view
as
selects.sno,sdept,cno,grade
fromsinnerjoinscons.sno=sc.sno
(2)向视图中插入数据
Insertintostu_viewvalues('98100','software','00001',90)
这说明,该视图是不可更新视图,不能向该视图中直接插入数据。
(3)创建视图
CREATETRIGGERInsteadTrig
ONstu_view
INSTEADOFINSERT
AS
BEGIN
DECLARE@XHchar(5),@XMchar(10),
@ZYchar(10),@KCHchar(5),@CJtinyint
SET@XM='佚名'
SELECT@XH=sno,@ZY=sdept,@KCH=cno,@CJ=grade
FROMinserted
INSERTINTOs(sno,sname,sdept)
VALUES(@XH,@XM,@ZY)
INSERTINTOscVALUES(@XH,@KCH,@CJ)
END
(3)再次向视图中插入数据
Insertintostu_viewvalues('98100','software','00001',90)
说明该操作向学生表、学生选课表插入了数据,从而间接向该视图中插入了数据。
1)查询学生表得到:
插入了学号为“98100”的学生
Select*froms
2)查询学生选课表:
插入了学号为“98100”的学生的选课记录
Select*fromsc
3)查询视图:
插入了该学生的记录
由此可以得出:
insteadof视图实现了不可更新视图的更新
Select*fromstu_view
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四 数据库的完整性 实验 数据库 完整性
![提示](https://static.bingdoc.com/images/bang_tan.gif)