(十九)触发器

版权声明:转载请给出原文链接 https://blog.csdn.net/youngyouth/article/details/83143891


需求案例

现有两张表,一张订单表,一张商品表,没生成一个订单,就意味着商品的库存需要减少 ;


触发器(trigger)

事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改),系统就会自动触发该代码,进行执行 ; 我们发现 触发器JS 中的 事件 ,很类似 ;

触发器三要素:事件类型、触发时间、触发对象 ;

  1. 事件类型:增删改,三种类型 ;
  2. 触发时间:前(before),后(after) :
  3. 触发对象:表中的每一条记录(行) ;

一张表只能拥有一种触发时间的一种类型的触发器,也就是一个触发时间只能搭配一种事件类型,因此,一张表最多有6个触发器 ;


创建触发器

类似于创建 JS 中的 监听事件函数 ;但是 mysql高级结构 中没有大括号({ }),因为需要特殊的语法来定义 ;


# 临时修改语句结束符 
# 因为触发器在定义的时候,需要当做一个整体看,但是内部却必须使用 ;
# 因此,临时修改下语句结束符
delimiter 自定义结束符

create trigger 触发器名字 触发时间 事件类型 on 表名 for each row
bigin -- 代表左大括号 { 
# 触发器的内容
# 每一句代码语句结尾都必须是 ;  
end -- 代表右大括号 }
-- 语句结束符
自定义结束符

-- 定义完毕以后,执行触发器的时候,需要按照 ; 结束语句
# 因此再将语句结束符改过来
delimiter ; 

在定义触发器的时候,切忌不要定义错了,比如监听 A 表变化,然后更新 B 表,假如你手一抖写出了,更新了 A 表,那么,就会陷入死循环 ;

A 表更新以后,触发触发器,然后触发器更新 A 表,然后又触发触发器更新 A 表,陷入死循环之中 ;


查看触发器

查看所有触发器,或者进行模糊匹配 ;

show triggers[\G] [like ‘pattern’] ; 

查看触发器创建语句:

show create trigger 触发器名字 ;

所有的触发器,都会被保存到一张表 (information_scheme.trigger) 中 ;


使用触发器

不需要我们自己去手动调用,而是类似于监听器一样,自动被触发 ;


修改&&删除触发器

触发器不能被修改,只能先删除再修改 ;

删除触发器

drop trigger 触发器名字 ;

触发器记录

不管触发器是否触发了,只要当某种操作 准备 执行了,系统就会将当前要操作的记录的当前状态和即将执行之后的新的状态,分别保存下来,供触发器使用 ;

其中,要操作的当前状态,保存到 old 中 ,新的状态保存到 new 中,其中 new 是假设执行完毕以后的记录,可能执行并不会进行,但是 new 是确确实实的记录将来的状态;

old 代表旧记录,new 代表新纪录 但是它们并不是任何时候都有值的,比如插入的时候,old 就是 null ,相对的,删除的时候 ,new 就是 null

使用:old/new.字段名

猜你喜欢

转载自blog.csdn.net/youngyouth/article/details/83143891