MySql触发器的使用

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,由服务器自动激活可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

创建触发器语法格式:
Create Trigger <触发器名>
{Before | After} <触发事件> On <表名>
For Each Row
[When <触发条件>]
<触发动作体>
触发时间:Before, After
触发事件: Insert,Update, Delete

删除触发器语法格式: Drop Trigger <触发器名>
查看创建触发器格式:
>Show Create Trigger <触发器名>
>Show Triggers;

这里创建了两个表:
1、奖惩信息表

Create table profit(
	staffno		int,		//员工编号
	staffname	char(20),	//员工姓名
	profitmoney	int,		//奖惩工资
	profittime	char(20)	//奖惩日期
);

2、员工工资表

Create table wages(
	staffno		int,		//员工编号
	staffname	char(20),	//员工姓名
	wagesbase	int not null,		//基本工资
	allprofit	int,		//奖惩总和
	allmoney	int,		//总工资
	wagestime	char(20)	//发放日期
);

3、员工信息表

Create table staff(
	staffno		int primary key,	/*员工编号*/
	staffname	char(20),		/*员工姓名*/
	staffsex	char(2),		/*员工性别*/
	workid		int			/*工作岗位编号*/
);

触发器的创建
1、插入时触发
(1)插入奖惩表profit数据时更新工资表wages里的allprofit

delimiter %%	// 设置以%%为判断语句结束,执行到%%为一个语句结束
create trigger insertprofit 
after insert on profit 
for each row 
begin 
update wages set allprofit = allprofit + new.profitmoney where staffno=new.staffno;
end %%
delimiter ;	// 设置以;为判断语句结束

(2)插入数据时更新allmoney为wagesbase+allprofit

delimiter %%
create trigger insert_allmoney 
before insert on wages 
for each row 
begin 
set new.allmoney = new.wagesbase + new.allprofit; 
end %% 
delimiter ;

2、更新数据时触发
(1)更新奖惩表profit数据时更新工资表wages里的allprofit

delimiter %%
create trigger updateprofit 
after update on profit 
for each row 
begin 
update wages set allprofit = allprofit + new.profitmoney - old.profitmoney where staffno=new.staffno;
end %%
delimiter ;

(2)更新数据时更新allmoney为wagesbase+allprofit

delimiter %%
create trigger update_allmoney 
before update on wages 
for each row
begin 
set new.allmoney = new.wagesbase + new.allprofit; 
end %% 
delimiter ;

3、删除时触发
当删除员工表(staff)时,对应删除奖惩信息表和员工工资表

delimiter %%
create trigger deletc_staff 
after delete on staff 
for each row 
begin 
delete from profit where profit.staffno = old.staffno;
delete from wages where wages.staffno = old.staffno;
end %%
delimiter ;

另外,下列语句

update wages set allmoney = allprofit + wagesbase;

也可以实现allmoney = wagesbase + allprofit,然而每次操作完数据需要跑一遍该语句,还是触发器比较好用

触发器效果测试

修改前工资表wages和奖惩表profit
在这里插入图片描述
在这里插入图片描述
奖惩表profit插入数据
在这里插入图片描述
工资表wages自动更新
在这里插入图片描述
奖惩表profit更改数据
在这里插入图片描述
工资表wages自动更新
在这里插入图片描述
员工表staff删除张三的数据后工资表wages和奖惩表profit相应删除张三的相关数据
在这里插入图片描述
在这里插入图片描述
结论:当需要对有关联的表做操作时,可以应用触发器,提高工作效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值