Mysql 触发器基础
触发器的概念
触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。——百度百科
上面是百度给的触发器的概念,我理解的触发器的概念,就是你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的sql语句,就这么简单。
超简说明:sql1->触发->sqlN,一条sql触发多个sql
触发器创建的四个要素
- 监视地点(table)
- 监视事件(insert/update/delete)
- 触发时间(after/before)
- 触发事件(insert/update/delete)
创建触发器
需求:在下订单的时候,对应的商品的库存量要相应的减少,即买几个商品就减少多少个库存量。
订单表:ord 商品表:goods
首先来创建表并添加几条数据:
create table goods( gid int, name varchar(20), num smallint);create table ord( oid int, gid int, much smallint);insert into goods values(1,'cat',40);insert into goods values(2,'dog',63);insert into goods values(3,'pig',87);
然后按照触发器创建的四个要素来进行分析:
监视谁:ord(订单表) 监视动作:insert(插入操作) 触发时间:after(在插入操作后触发) 触发事件:update(触发更新操作)
最后创建触发器:
create trigger t1 afterinsert on ordfor each rowbegin update goods set num=num-2 where gid = 1;end$
分析:触发器的名称为t1,触发时间为after,监视动作为insert,监视ord表,for each row最后在进行讨论,这里先记住就行了,begin和end之间写触发事件,这里是一个update语句。意思是不论我下什么订单,都会把商品编号为1的商品的库存量减去2个。
注意:先不要运行上面的代码,因为mysql的执行结束标识默认是;。如果运行以上的sql语句,mysql碰到;时会自动停止执行,然后end语句就执行不到了。所以我们需要先将mysql的结束标识符改为其他的字符,一般都选用或者,这里选用来作为执行的结束标识。使用下面的语句来修改MySQL执行的结束标识。
delimiter $ //设置MySQL执行结束标志,默认为;
查看和删除已有的触发器
- 查看已有触发器:show triggers
- 删除已有触发器:drop trigger triggerName
触发器中引用行变量
- 在触发目标上执行insert操作后会有一个新行,如果在触发事件中需要用到这个新行的变量,可以用new关键字表示
- 在触发目标上执行delete操作后会有一个旧行,如果在触发事件中需要用到这个旧行的变量,可以用old关键字表示
- 在触发目标上执行update操作后原纪录是旧行,新记录是新行,可以使用new和old关键字来分别操作
当下订单时减少相应的货品的库存量,创建触发器:
create trigger t2afterinsert on ordfor each rowbegin update goods set num=num-new.much where gid=new.gid;end$
当删除订单时增加相应的修改货品的库存量,创建触发器:
create trigger t3afterdeleteon ordfor each rowbegin update goods set num=num+old.much where gid=old.gid;end$
当更新订单的购买数修改相应的修改货品的库存量,创建触发器:
create trigger t4before updateon ordfor each rowbegin update goods set num=num+old.much-new.much where gid = new.gid;end$
after和before的区别
after操作,是在执行了监视动作后,才会执行触发事件 before操作,是在执行了监视动作前,会执行触发事件 两者在一般的触发器中并没有什么区别,但是有的时候有区别,如:
需求:在用户定了超过库存的订单后,会修改该订单的订购数量,使订购数量的最大值和库存量相同 分析:首先判断 订购量 > 库存量,然后做将订购量改为库存量
创建触发器:
create trigger t5beforeinsert on ordfor each rowbegin declare restNum int; select num into restNum from goods where gid = new.gid; if new.much > restNum then set new.much = restNum; end if; update goods set num=num-new.much where gid=new.gid;end$
注意:这里如果使用的是after就会报错,如果使用的是after,就会先执行insert操作,也就是插入订单操作,然后在进行判断下单数量和库存量,得出新的下单数量,可是已经执行了下单操作了,所以就会报错。这里必须使用before操作。
for each row是干什么的?
在oracle触发器中,触发器分为行触发器和语句触发器
比如:
create trigger tnafterupdateon xxtablefor each row #每一行受影响,触发事件都执行,叫做行触发器begin sqlN;end$
执行:
update xxtable set xxx=xxx where id>100;
该修改操作假设100行,那么sqlN,会触发多少次?答案:会触发100次。
拓展:
在oracle中,for each row如果不写,无论update语句一次影响了多少行,都只执行一次触发事件。 比如:1人下了订单,买了5件商品,insert 5次,可以用行级触发器,修改5次库存;用语句级触发器触发,insert一条发货提醒。 遗憾的是mysql目前不支持语句级触发器。
- thinkcmf安装教程与目录结构详解 快速上手版
- finecms如何批量替换文章中的关键词?
- dedecms批量修改文章为待审核稿件怎么操作
- 群体智能算法-黏菌寻找食物最优路线行为模拟
- finecms设置伪静态后分享到微信不能访问怎么处理
- composer安装其实可以很简单 两行命令就解决了
- 章神的私房菜之数据预处理
- 如何调用finecms指定栏目的描述关键词
- finecms栏目文章页seo设置
- Logistic回归实战篇之预测病马死亡率(一)
- DedeCMS后台500错误一种原因是不支持PHP5.3、5.4及以上版本
- finecms指定从第几篇文章开始调用5条记录,并调用文章所在栏目
- finecms如何调用多个栏目的子栏目
- 从傅立叶变换到Gabor滤波器
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Laravel 简单实现Ajax滚动加载示例
- PHP设计模式之解释器(Interpreter)模式入门与应用详解
- Laravel 实现在Blade模版中使用全局变量代替路径的例子
- PHP实现关键字搜索后描红功能示例
- 如何在CentOS中安装PHP7.4的方法步骤
- Linux安装Python3如何和系统自带的Python2并存
- Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
- PHP学习记录之常用的魔术常量详解
- laravel orm 关联条件查询代码
- PHP实现财务审核通过后返现金额到客户的功能
- Laravel框架中的路由和控制器操作实例分析
- php利用array_search与array_column实现二维数组查找
- Python实现手绘图效果实例分享
- php如何把表单内容提交到数据库
- Laravel5.5 视图 – 创建视图和数据传递示例