触发器: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
触发器不能修改,只能先删除后新增;
drop trigger 触发器名字;
触发器记录:不管触发器是否被触发,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后的新的状态给分别保留下来,供触发器使用
要操作的当前状态保存到old中,操作之后可能形态保存给new
old代表的是旧记录,new代表的是新记录;删除的时候是没有new的,插入的时候是没有old的;
old和new都是代表记录本身,任何一条记录除了数据还有字段名字,使用方式:old.字段名 /new.字段名; new代表假设发生之后的结果
如果触发器内部只有一条要执行的SQL指令,可以省略大括号begin和end
delimiter $$
create trigger after_order after insert on t_order for each row
begin
update t_product set total :=total-new.amount where id=new.pid;
end
$$
delimiter ;