登录  /  注册
博主信息
博文 81
粉丝 1
评论 0
访问量 119961
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
mysql 触发器
有什么是忘不了的的博客
原创
715人浏览过

触发器,当我们在对一个表进行增删改操作后,可以自动的对相关联的表进行一些默认的操作。

DELIMITER $		  #设置结束标识符
create trigger t1     #设置触发器的名称
after 			  #触发的顺序,在当前sql执行之前还是在之后来执行该触发器。after/before
insert			  #触发的条件,当前是添加操作,共有insert/update/delete三种
on ord			  #当操作张表的时候触发 ord 表名
for each row		    #没执行一行都会触发一次,叫做行触发器
begin			
update goods set num = num - new.much where id = new.gid; #触发后执行的sql
end$

一个简单的触发器。修改结束定界符, 是因为mysql 默认是遇到 ; 就结束。但是 begin 后的sql 也是;结束。就导致触发器意外的结束,触发器语法错误的情况。所以把结束的定界符修改后就可以解决。

例子:

新建一个商品表,和订单表。

#商品表
create table goods(id int,name varchar(35),num int)
#订单表
create table ord(id int,gid int,much int);
#商品表添加信息
insert into goods values(1,'dog',43),(2,'pig',45);

当我们下一个订单后希望自动,去修改商品表的库存。

用我上面的的t1触发器就可以来实现,但是不严谨。可能会出现卖超的情况。


下面我们讲一下,添加、删除、修改 如何在触发器中获取他们操作的对应记录的。

添加:

    添加用 new 来表示新增。

删除 :

    删除用 old 来表示删除

修改

    修改是用 old 到 new 的过程。 old(旧的数据)->new(新的数据)。

new和old中保存的都是对应某一条数据(也就是一个数组)。

当我们删除一条订单的时候,应该吧对应的商品库存加上

create trigger t2     #设置触发器的名称
after 			  #触发的顺序,在当前sql执行之前还是在之后来执行该触发器。after/before
delete			  #触发的条件,当前是添加操作,共有insert/update/delete三种
on ord			  #当操作张表的时候触发 ord 表名
for each row		
begin			
update goods set num = num + old.much where id = old.gid; #触发后执行的sql
end$

我们接着来说如何解决,卖超的现象吧。

    我们在下订单的时候去获取一下该订单的库存,然后进行比较超出就把订单数改成库存数。(主要是了解 触发器中的使用 if操作和after/before的差异性)

create trigger t2
after
insert
on ord
for each row
begin
declare #声明一个变量
rnum int;
select num into rnum from goods where id = new.gid; # select...into...吧查询出的值赋值给一个变量
if new.much > rnum then	    #if判断
    set new.much = rnum ;
end if;                     #if判断结束
update goods set num = num - new.much where id = new.gid; 
end$

    image.png

在上面我用的是after来声明的,这时候你会看到报了一条错误:

        ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger

这里就体现到after和before的差别了。

我们不能再sql执行完成之后再对这条语句进行值得改变。

所以需要把after 改成 befroe,在他执行前去执行触发器


create trigger t2
before
insert
on ord
for each row
begin
declare
rnum int;
select num into rnum from goods where id = new.gid;
if new.much > rnum then	   
   set new.much = rnum ;
end if;                     
update goods set num = num - new.much where id = new.gid; 
end$

所以我们可以根据我们的业务逻辑,在触发器被触发时,执行一些需要的业务操作。



本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学