【mysql】E4 触发器的定义和应用

E4 触发器的定义和应用
一、实验目的:
熟练使用MySQL触发器的定义和应用。
二、实验要求:
1、基本硬件配置:英特尔Pentium III 以上,大于4G内存;
2、软件要求:Mysql;
3、时间:1小时;
4、撰写实验报告并按时提交。
三、实验内容:
问题1:创建触发器:当从emp表中删除一些记录时,将删除的记录写入员工历史表(首先创建历史表)。

use example
create table emp_his as select * from emp where 1 = 2;

在这里插入图片描述

delimiter //
create trigger tr_del_emp
after delete
on emp
for each row
begin
insert into emp_his(deptno, empno, ename, job, mgr, sal, comm, hiredate)
values(old.deptno, old.empno, old.ename, old.job, old.mgr, old.sal, old.comm, old.hiredate);
end //

在这里插入图片描述

Select * from emp_his;

在这里插入图片描述

问题2:设计一个行触发器:当DEPT表中deptno列的值被更新时,EMP表中相应的deptno值也被修改。

Delimiter //
create trigger tr_update_emp                                 
after update                                                 
on dept                                                      
for each row                                                 
begin                                                        
update emp set deptno = new.deptno where deptno = old.deptno;
end //                                                       

在这里插入图片描述
直接进行更新会遇到这么一个报错

Cannot delete or update a parent row: a foreign key constraint fails

因为有外键约束,所以不能直接update,所以我们先把外键约束检查关闭

Set foreign_key_checks = 0;

在这里插入图片描述

update dept set deptno = 6 where deptno = 1;

在这里插入图片描述

select * from emp;

在这里插入图片描述
执行之后可见成功了,原本的deptno从1变成了6
tips:这里注意,考虑到主键唯一,所以不要设置重复的deptno,要不然会报错

问题3:设计一个行触发器用于emp表的更新,当修改员工的工资sal时候触发更新所在部门的工资总和(首先在dept表中添加一个sumsalary coulmn)。

create trigger tri_update_emp                                                  
after update                                                                   
on emp                                                                         
for each row                                                                   
begin                                                                          
update dept set sumsalary = (select sum(sal) from emp where deptno = new.deptno) where deptno = new.deptno;
end //

在这里插入图片描述

update emp set sal = 12345 where empno = 2;

在这里插入图片描述

此处被报错,因为之前我们创建过一个emp表的update触发器,不删除的话就会连环触发,所以我们先把之前那个触发器删除掉.


tips:如果是用cmd直接drop则没有什么问题,但是如果是用navicat等工可视化工具删除触发器的时候不要忘了保存!!


select * from dept;

在这里插入图片描述

问题4:创建触发器:当emp表中删除或插入一些记录时,将每个员工所在部门的最新人数写入dept表(首先向dept表添加一个person coulmn)。
同样,我们首先要把之前创建的delete触发器给删除.

delimiter //
create trigger tr_delete_emp                                                  
after delete                                                                  
on emp                                                                        
for each row                                                                  
begin                                                                         
update dept set persons = (select count(*) from emp where deptno = old.deptno) where deptno = old.deptno;
End //

在这里插入图片描述

delete from emp where empno = 5;
select * from dept;

在这里插入图片描述

delimiter //                                                                  
create trigger tr_insert_emp                                                  
after insert                                                                  
on emp                                                                        
for each row                                                                  
begin                                                                         
update dept set persons = (select count(*) from emp where deptno = new.deptno) where deptno = new.deptno;
End //

在这里插入图片描述

insert into emp values(23, 'laurie', 'Manager', null, '2022-04-14', 45236.0, 50
0, 3);
Select * from dept;

在这里插入图片描述

新手上路,有错请指正;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Khalil三省

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值