需求:有两张表,一张订单表,一张商品表,每生成一个订单,意味着商品的库存要减少.

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

触发器:事件类型,触发时间,触发对象

事件类型:增删改,三种类型 insert delete 和update

触发时间:前后:before 和 after

触发对象:表中的每一条记录(针对行)

一张表中只能拥有一种触发时间的一种类型的触发器:一张表最多能有6个触发器

创建触发器

mysql高级结构中:没有大括号,都是对应的字符符号代替

触发器基本语法

--临时修改语句结束符
Delimiter 自定义符号 后续代码中 只有碰到自定义符号才算结束

create trigger 触发器名字 触发时间 事件类型 on 表名 for each row
Begin -- 代表左大括号:开始
-- 里面就是触发器的内容:每行内容都必须使用语句结束符:分号
End -- 代表右大括号:结束
-- 语句结束符

自定义符号
-- 将临时修改修正过来
Delimiter ;

 

 

查看触发器

查看所有触发器或者模糊匹配
show triggers [like 'patten'];

可以查看触发器创建语句
show create trigger after_order;
所有的触发器都会保存到一张表中 :select * from information_schema.triggers;

使用触发器

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

触发器的确工作了:订单生成之后,对应的商品数量减少,当前减少的商品并不是订单中产生的商品,而是固定死的商品(触发器不合理)

 

修改触发器&删除触发器

触发器不能修改,只能先删除,后新增

删除触发器
drop trigger 触发器名;


触发器记录

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

old代表的是旧记录,new代表的是新纪录
删除的时候是没有new的。插入的时候是没有old
old 和new都是代表记录本身:任何一条记录除了有数据,还有字段名字
使用方式:old字段名/new 字段名