数据库实验六


-- 1.将stu数据库中student表的sno定义为主键;
alter table student
alter column sno varchar(20) not null
alter table student
add primary key (sno)
--2.将数据库stu的表course的cno字段定义为主键,约束名称为cno_pk;
alter table course
alter column cno varchar(10) not null
alter table course
add constraint cno_pk  primary key(cno)
--3.为表course中的字段cname添加唯一值约束;
alter table course
add constraint c1 unique(cname)
--4.将数据库stu的表sc的sno及cno字段组合定义为主键,约束名称为sc_pk;
alter table sc
alter column cno varchar(10) not null
alter table sc
alter column sno varchar(20) not null
alter table sc
add constraint sc_pk primary key(sno,cno)
--5.对于数据表sc的sno、cno字段定义为外码,使之与表student的主码sno及表course的主码cno对应,实现如下参照完整性:

--1)删除student表中记录的同时删除sc表中与该记录sno字段值相同的记录;
--2)修改student表某记录的sno时,若sc表中与该字段值对应的有若干条记录,则拒绝修改;
--3)修改course表cno字段值时,该字段在sc表中的对应值也应修改;
--4)删除course表一条记录时,若该字段在在sc表中存在,则删除该字段对应的记录;
--5)向sc表添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入;
alter table sc
add constraint f1 foreign key (sno) references student(sno)
on delete cascade
on update no action
alter table sc
add constraint f2 foreign key (cno) references course(cno) 
on update cascade
on delete cascade
--6.定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三位皆为0;
alter table student
add constraint s1 check (sno like '[1-9]00______')
--7.定义stu数据库中student表中学生年龄值在16-25范围内;
alter table student
add constraint s2 check (sage between 16 and 25)
--8.定义stu数据库中student表中学生姓名长度在2-8之间;
alter table student
add constraint s3 check (len(sname) between 2 and 8)
--9.定义stu数据库中student表中学生性别列中只能输入“男”或“女”;
alter table student
add constraint s4 check (ssex in ('男','女'))
--10.定义stu数据库student表中学生年龄值默认值为20;
alter table student
add constraint s5 default(20) for sage
--11.修改student表学生的年龄值约束可以为15-30范围内;
alter table student
drop s2
alter table student
with nocheck
add constraint s2 check (sage between 15 and 30)
--12.删除上述唯一值约束、外键约束及check约束;
alter table course
drop c1
alter table sc
drop f1,f2
alter table student
drop s1,s2,s3,s4,s5
--13.设计触发器实现如果一个学生转专业了,那么输出一条信息显示该学生各门课程的平均分。
use stu
go
create trigger up_sdept
on student
for update
as
if update(sdept)
begin
declare @average int,@sno varchar(20)
select @sno=sno
from deleted
select @average=avg(grade)
from sc
where sc.sno=@sno
print @sno
end

--14.设计触发器实现如果成绩被修改了20分以上,则输出提示信息“修改成绩超过20分,请慎重”。
go
create trigger ck_grade on sc
for update
as
declare @grade int
select @grade=grade
from inserted
if @grade>20
begin
print '修改成绩超过20分,请慎重'
end

--15. 在student表中增加一列total,表示学生选课总门数,初始值为0。定义一个触发器,实现如下完整性约束:当向SC表插入选课记录时,自动更新student表对应学号的total值,考虑成批插入数据的情况。
alter table student
add total int default(0)
go
create trigger xuanke_check
on sc
for insert
as
declare @sno varchar(20)
select @sno = sno
from inserted
update student
set total=total+1
where sno=@sno

--16.设计一触发器,约束数据库系统课程的课容量为120。
go
create trigger full_course on course
instead of insert
as
declare @num int
select @num=count(*)
from course
if @num=120
begin
print '课容量已经达到最大了'
end
else
begin 
insert into course select * from inserted
end

--17.设有两个表:商品库存表(商品编号,商品名称,库存数量,库存单价,库存金额);商品销售表(商品编号,商品名称,购货商号,销售数量,销售单价,销售金额);设计一触发器实现如下业务规则:
create table kucun(
pno varchar(10),
pname nvarchar(20),
number int,
price int,
total int)
create table xiaoshou(
pno varchar(10),
pname nvarchar(20),
cno varchar(10),
counts int,
price int,
totalprice int)
--(1)保证在商品库存表中插入的数据,库存金额 = 库存数量 * 库存单价。
--(2)如果销售的商品不存在库存或者库存为零,则返回提示信息。否则自动减少商品库存表中对应商品的库存数量和库存金额。
--建表并验证触发器的执行。
go
create trigger ck_total
on kucun
instead of insert
as
declare @price int,@number int,@total int,@pno varchar(10),@pname nvarchar(20)
select @price = price from inserted
select @number = number from inserted
select @total=@price*@number
select @pno = pno from inserted
select @pname = pname from inserted
insert into kucun
values(@pno,@pname,@number,@price,@total)

go
create trigger tr_sa
on xiaoshou
for insert
as
if ((select number from kucun where kucun.pno=(select pno from inserted))=0)
begin
    print '库存不足'
    rollback transaction
end
else
begin
update kucun
set number=number-(select counts from inserted)
where kucun.pno=(select pno from inserted)
update kucun
set total=number*price
where kucun.pno=(select pno from inserted)
end

--18.建立教师表(教工编号,姓名,专业,职称,工资)和
--工资变化表(教工编号,原工资,新工资),设计触发器实现教授的工资不得低于4000元,如果低于4000元则自动改为4000元。
create table teacher(
tno varchar(10),
tname nvarchar(10),
tdept nvarchar(20),
zhicheng nvarchar(20),
gongzi int)
create table gongzi(
tno varchar(10),
old_gz int,
new_gz int)
go
create trigger gz_ck
on teacher
for update,insert
as
declare @gz int
declare @tno varchar(10)
select @gz=gongzi from inserted
if @gz<4000
begin
select @tno = tno from inserted
update teacher
set gongzi=4000
where tno=@tno
end
--19.    使用第18题的两个表设计触发器实现如果教工的工资发生变化则向工资变化表插入一条记录,包含教工编号,原工资,新工资。
go 
create trigger gzbh
on teacher
for update
as
if update(gongzi)
begin
declare @old_gz int,@new_gz int,@tno varchar(10)
select @old_gz=gongzi from deleted
select @new_gz = gongzi from inserted
select @tno = tno from inserted
insert into gongzi 
values(@tno,@old_gz,@new_gz)
end

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实验九:数据库的完整性约束 一、实验目的 1. 掌握主键约束、外键约束及check约束的用法; 2. 掌握默认值约束和默认值对象的应用; 3. 掌握用触发器实现参照完整性的方法。 二、实验学时 2学时 三、实验要求 1. 了解约束、默认值; 2. 了解触发器的定义方法; 3. 掌握触发器的编写和运行方法 4. 完成实验报告。 四、实验内容 1. 数据完整性。以实验数据库为基础数据,请使用T- SQL语句完成以下内容,并将SQL语句写在实验报告册中: 1) 将数据库stu的course的cno字段定义为主键,约束名称为cno_pk; 2) 为course中的字段cname添加唯一值约束; 3) 对于数据scsnocno字段定义外码,使之与student主码sno及表cours e的主码cno对应,实现如下参照完整性: 删除student中记录的同时删除sc中与该记录sno字段值相同的记录; 修改student某记录的sno时,若sc中与该字段值对应的有若干条记录,则拒绝 修改; 修改coursecno字段值时,该字段sc中的对应值也应修改; 删除course一条记录时,若该字段在在sc中存在,则删除该字段对应的记录; 向sc添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入; 4)定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三 位皆为0; 5)定义stu数据库student中学生年龄值在16~25范围内; 6)定义stu数据库student中学生年龄值默认值为20; 7) 修改student学生的年龄值约束可以为15~30范围内; 8) 删除course中字段cname的唯一值约束; 2. 以实验数据库为基础数据,编写以下触发器并测试。 1) 为course建立一个 INSERT触发器,当插入的新行中课程学分(ccredit)的值不是1~6时,就激活该出发器 ,撤销该插入操作,并使用RAISERROR语句返回一个错误信息。 2)为course再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激 活该触发器级联更新sc中相关的课程号信息,并使用PRINT语句返回一个提示信息 。 3)为student创建DELECT触发器,在删除中的一条记录的同时将sc中的相应记录 也删除。 4)创建INSTEAD OF触发器,当向sc中插入记录时,先检查sno列上的值在student中是否存在,如果 存在执行插入操作,如果不存在则提示"该学生不存在"。 5)比较约束与触发器的执行顺序。(在一个中创建CHECK约束和触发器,然后向中 插入一条不符合约束和触发器的记录,察看谁先发生作用。)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值