mysql触发器
触发器:trigger,事先为某张表绑定好一段代码,当表中某些内容发生改变的时候(增删改),系统会自动触发代码,执行

触发器:事件类型,触发时间,触发对象
事件类型:增删改,三种类型,insert,delete,update
触发时间:前,后,before,after
触发对象:针对表中的每一条记录(行)
一张表中只能拥有一种触发时间、一种类型的触发器,最多一张表能有6个触发器,2(触发时间)*3(触发类型)=6

创建触发器:
在sql高级结构中,没有大括号,多事用对应的字符代替的
触发器基本语法:
-- 临时修改语句结束符
delimiter 自定义符号:后续代码中,只有碰到自定义符号才算结束
create trigger 触发器名字 触发时间 时间类型 on 表名 for each row
begin -- 代表左大括号,开始
-- 触发器内容,每行内容都必须使用语句结束符 ; 结束
end --代表右大括号,结束
-- 语句结束符
自定义符号
-- 将临时修改修正过来
delimiter ;

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,60);

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 ;

查看所有触发器或者模糊匹配
show triggers [like 'partten'] ;
查看触发器创建语句
show create trigger 触发器名字;

所有的触发器都会保存到一张表中,information_schema.triggers;\
select * from information_schema.triggers;


使用触发器
触发器:不需要手动调用,当某种情况发生时会自动触发,(订单里面插入记录之后)

-- 插入订单
insert into my_order values(null,1,2)

触发器不能修改,只能先删除后新增
drop trigger 触发器名字;
drop trigger after_order;

触发器记录:是指不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后的新的状态给分别保留下来,供触发器使用:要操作当前状态保存在old中,操作之后的可能形态保存给new

old代表的是旧记录,new代表新记录
删除的时候是没有new的,插入的时候是没有old的
old和new都是代表记录本身,任何一条记录都除了有数据,还有字段名字。
使用方式:old字段名/new字段名(new代表假设发生之后的结果)

-- 触发器,订单生成一个,商品减少
-- 临时修改语句结束符
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
-- 结束触发器
$$
-- 修正临时语句结束符
delimiter ;

-- 插入订单
insert into my_order values(null,1,2)