( 17 )MySQL中的触发器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了( 17 )MySQL中的触发器相关的知识,希望对你有一定的参考价值。
MySQL中的触发器
触发器
需求:有两张表,一张定单表,一张商品表.每生成一个订单,商品库存就相应减少.
触发器 ( trigger )
事先为某张表绑定好一段代码,当某些内容发生改变的时候(增删该),系统会自动触发代码的执行.
触发器包括 : 事件类型,触发时间,触发对象
事件类型: 增删改,三种类型 insert ,delete和update.
触发时间: 触发前后 before 和 after
触发对象:表中的每一条记录(行)
一张表中只能有一种触发时间的一种类型的触发器 : 一张表最多有6个触发器.
创建触发器
------------------------------------------------------------
-- 临时修改语句结束符
delimiter 自定义符号
create trigger 触发器名字 触发时间 事件类型 on 表名 for each row
begin -- 代表左大括号:开始
-- 里面是触发器的内容
end --代表右大括号:结束
-- 将临时修改的语句结束符修改为分号
delimiter ;
------------------------------------------------------------
创建表并插入数据
-- 创建触发器 生成一个订单,商品库存减少
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.id ;
end
delimit ;
查看触发器
查看所有触发器或者模糊匹配
show trigger [like ‘pattern‘]
查看触发器创建语句:
show create trigger 触发器名字 ;
所有的触发器都会保存到系统的一张表中 information_schemea.triggers
使用触发器
触发器:不需要手动调用,当某种情况(触发类型)下会自动触发.
修改触发器&&删除触发器
触发器不能被修改,只能删除之后新增
drop trigger 触发器名称 ;
触发器记录
触发器记录 : 不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前操作记录的当前状态和即将执行之后的新的状态给分别保留下来,供触发器使用.其中要操作当前状态保存在old中,操作之后的可能形态保存到new中.
old 代表的是就记录,new代表新纪录
插入的时候没有old , 删除的时候没有new. 任何一条记录除了有数据,还有字段名字.
old和new的使用方式 : old.字段名 / new.字段名 (new 代表假设发生之后的结果)
执行代码结构
执行代码结构 : 顺序结构,分支结构,循环结构
分支结构:实现准备多个代码块,按照条件选择性执行某段代码
在mysql中只有 if 分之
基本语法:
-----------------------------------------------------------
if 条件判断 then
-- 满足条件要执行的代码
else
-- 不满足条件执行的代码
end if ;
------------------------------------------------------------
触发器结合if分支,若商品数量不够,就不能生成订单.
循环结构
循环结构: 某段代码在指定的条件重复执行
while循环基本语法
------------------------------------------------------------
while 条件判断 do
-- 满足条件要执行的代码
-- 变更循环条件
end while ;
------------------------------------------------------------
循环控制 : 在循环内部进行循环判断,mysql中没有continue和break.
iterate : 迭代,类似continue 后面的代码不执行,循环重新来过
leave : 离开 类似break 整个循环结束.
使用方式: iterate / leave 循环名字;
-- 定义循环名字
循环名字 : while 条件 do
-- 循环体
--循环控制
iterate / leave 循环名字 ;
end while ;
以上是关于( 17 )MySQL中的触发器的主要内容,如果未能解决你的问题,请参考以下文章
SQLite - 将 MySQL 触发器转换为在 SQLite 上工作