触发器(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相应删除张三的相关数据
结论:当需要对有关联的表做操作时,可以应用触发器,提高工作效率