create trigger <触发器名称>
触发器与事件的差别:事件是基于特定时间周期来执行的,触发器是基于某个表所产生的事件触发,事件也称之为临时触发器。
mysql支持的触发器有3种:INSERT, UPDATE, DELETE,加上BEFORE,AFTER 2种触发,3*2组合一共6种,也就意味着一张表最多支持6个触发器。
触发器也能够触发外部函数,这个属于高级应用的范畴了,这里暂时不讨论。
设计一个名称为tr_emp的触发器,完成的功能是:当删除部门表中的记录时,将职工表中的部门信息置空。
CREATE trigger tr_emp after DELETE ON tb_dept FOR EACH row
UPDATE tb_employee
SET deptno=''
WHERE deptno=(select deptno from tb_dept);
-------------------------------------------------------------------------------------------------------------
-- 创建表
create table my_goods(
id int primary key auto_increment,
name varchar(20) not null,
price decimal(10,2) default 1,
inv int comment '库存数量')charset utf8;
insert into my_goods values(null,'iPhone6s',5288,100),(null,'s6','6088',100);
create table my_order(
id int primary key auto_increment,
g_id int not null comment '商品ID',
g_number int comment '商品数量'
)charset utf8;
-- 触发器: 订单生成一个, 商品库存减少
-- 临时修改语句结束符
delimiter $$
create trigger after_order after insert on my_order for each row
begin
-- 触发器内容开始
update my_goods set inv = inv - 1 where id = 2;
end
-- 结束触发器
$$
-----------------------------------------------------------------
-- 触发器: 订单生成一个, 商品库存减少
-- 临时修改语句结束符
delimiter $$
create trigger after_order after insert on my_order for each row
begin
-- 触发器内容开始: 新增一条订单: old没有,new代表新的订单记录
update my_goods set inv = inv - new.g_number where id = new.g_id;
end
-- 结束触发器
$$
-------------------------------------------------------------------
create trigger before_order before insert on my_order for each row
begin
-- 判断商品库存是否足够
-- 获取商品库存: 商品库存在表中
select inv from my_goods where id = new.g_id into @inv;
-- 比较库存
if @inv < new.g_number then
-- 库存不够: 触发器没有提供一个能够阻止事件发生的能力(暴力报错)
insert into XXX values(XXX);
end if;
end