Mysql触发器
触发器
触发器:trigger,事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码执行。
触发器:事件类型,触发时间,触发对象
事件类型:增删改,三种类型 insert,delete和update
触发时间:前后:before和after
触发对象:表中的每一条记录(行)
一张表中只能拥有一种触发时间的一种类型的触发器:最多一张表能有6个触发器。
创建触发器
在mysql高级结构中:没有大括号,都是对应的字符符号代替
触发器基本语法
--临时修改语句结束符
Delimiter 自定义符号:后续代码中只有碰到自定义符号才算结束
Create trigger 触发器名字 触发时间 事件类型 on 表名 for each row
Begin --开始
--里面就是触发器的内容:每行内容都必须使用语句结束符;分号
End --结束
--语句结束符
自定义符号
--将临时修改的结束符修改过来
Delimiter ;
查看触发器
show triggers [like ‘pattern’];
查看触发器创建语句
show create trigger 触发器名字;
所有触发器都会保存在一张表中:Information_schema.triggers
SELECT * FROM Information_schema.triggers;
使用触发器
触发器:不需要手动调用,而是当某种情况发生时会自动触发。(订单里面插入记录之后)
删除触发器
Drop trigger 触发器名字;
触发器记录
不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态分别给保留下来,供触发器使用:其中,要操作的当前状态保存到old中,操作之后的可能形态保存给new.
Old代表的是旧记录,new代表的是新纪录
删除的时候是没有new的;插入的时候是没有old
Old和new都是代表记录本省:任何一条记录除了有数据,还有字段名字。
使用方式:old.字段名 new.字段名
-- 创建表 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 ; -- 查看所有触发器 show triggers; show create trigger after_order; SELECT * FROM Information_schema.triggers; -- 插入订单 insert into my_order values(null,1,2); -- 删除触发器 drop trigger after_order; Delimiter $$ create trigger after_order after insert on my_order for each row begin -- 触发器内容开始 update my_goods set inv = inv - new.g_number where id=new.g_id; end $$ -- 修正临时语句结束符 Delimiter ;