实验学时:2学时
实验类型:设计
实验要求:必做
一、实验目的
通过编写触发器,加深对触发器功能和应用需求的理解,明白存储过程在使用时需要调用,而触发器是在预先定义好的事件(如INSERT、DELETE等操作)发生时,才会被MySQL自动调用。学生应学会根据具体需求选择不同的触发时机和触发事件。
二、实验内容
创建触发器,以shop数据库中sh_goods商品表和sh_user_shopcart购物车表为例,演示用户商品添加购物车后自动减少对应商品的库存。
操作方法如下:
1、创建触发器
为sh_user_shopcart购物车表创建了一个触发器:在插入数据前先判断购物车中的商品数量是否大于等于sh_goods商品表中商品的库存,若是则将待插入sh_user-shopcart表中购买数量修改为此商品的最大库存,同时将sh_goods表中商品的库存修改为0,若不是则直接修改sh_goods表中商品的库存。
2、触发器的触发
① 首先查看sh_goods表中商品编号为5的库存量stock。
② 接着向购物车表sh_user_shopcart中插入数据,然后触发设置的触发器。
③ 最后查看sh_goods和sh_user_shopcart表在触发器触发后商品信息的变化。
3、查看触发器
运用show triggers like “名称”\G;命令查看某一个触发器。
4、删除触发器
运用drop triggerss [IF EXISTS] “触发器名称”\G;命令删除某一个触发器。
三、课后练习题
1、在shop.sh_order_goods表上创建一个触发器,当添加订单-商品信息时,修改goods表中对应商品的库存量。
--增加字段cnum,默认值为0
alter table course add cnum smallint default 0;
--创建一个触发器,当对某门课程设置其限选人数时,如果设置的人数小于20,则自动更改为20
delimiter $$
create trigger cnum_tri before update
on course for each row
begin
if new.cnum<20 then
set new.cnum=20;
end if;
end
$$
delimiter ;
--更新课程1的cnum为18
update course set cnum=18 where cno='1';
--更新课程2的cnum为40
update course set cnum=40 where cno='2';
--插入一条选课记录时,如果超出了课程当前的可选名额,则不允许选课;如果选课成功,则可选名额减1
delimiter $$
create trigger sc_insert_tri after insert on sc for each row
begin
declare num smallint default 0;
select cnum from course where cno=new.cno into num;
if num=0 then
delete from sc where sno=new.sno and cno=new.cno;
else
set num=num-1;
update course set cnum=num where cno=new.cno;
end if;
end
$$
delimiter ;
--向sc表中插入一条2号课程的选课记录
insert into sc(sno,cno) values('201910123','2');
--删除触发器
drop trigger sc_insert_tri;