mysql中触发器有什么作用,什么是MySql触发器?作用是什么?

由于项目经理临时有事,被安排面试一个新人,期间聊到了MySql的存储过程、触发器等知识,发现他对这一块的知识比较陌生,由于之前讲过存储过程,现在就讲讲什么是触发器。其实触发器很好理解,按照字面意思,就是会触发一系列事件操作的东西。

基本概念:触发器是与表事件相关的特殊存储过程,它的执行不由程序调用,也非手工启动,而是由事件触发而被执行的(需要区别存储过程:存储过程则需要主动调用其名字执行)

触发器(trigger):事先为某张表绑定一段代码,当表中的某些内容发生增、删、改时,系统会自动触发代码并执行。

讲解触发器的经典案例,就是下订单,比如存货100件,如果下订单购买10件,该商品的库存量需相应减少,即买几个商品就减少多少个库存量,先看建表语句:

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',100);

insert into goods values(2,'dog',200);

insert into goods values(3,'pig',300);

创建触发器语句如下:

DROP TRIGGER IF EXISTS databaseName.tri_Name;

CREATE TRIGGER tri_Name -- tri_Name代表触发器名称

tirgger_time trigger_event on tableName -- tirgger_time为触发时机,可选值有after/before,trigger_event为触发事件,可选值有insert/update/delete

FOR EACH ROW -- 这句话在mysql是固定的,表示任何一条记录上的操作满足触发事件都会触发该触发器。

BEGIN

sql语句;

END

(1)查看已有触发器:SHOW TRIGGERS

(2)删除已有触发器:DROP TRIGGER triggerName

CREATE TRIGGER t1

AFTER

INSERT

ON ord

FOR EACH ROW

BEGIN

UPDATE goods SET num=num-2 WHERE gid = 1;

END

我们现在已经建立了一个简单的存储过程,只要订单表ord的gid=1的商品有INSERT(只要买了猫cat,猫的存货就减少2,当然,实际开发过程中减去的具体值,需要是订单购买数量值),看如下过程:

c84d942c918b2d81e47ecfe8d2ed8875.png

我们执行一下插入操作:INSERT INTO ord VALUE(1,10,66)

e12e5a7abf26666fe1463ec106da810b.png

触发器创建的四个要素

1)监视地点(table)

2)监视事件(insert/update/delete)

3)触发时间(after/before)

4)触发事件(insert/update/delete)

监视谁:ord(订单表)

监视事件:insert(ord表插入操作)

触发时间:after(在ord插入操作后触发)

触发事件:update(触发更新操作 goods表更新)

触发器中引用行变量

1)在触发目标上执行insert操作后会有一个新行,如果在触发事件中需要用到该新行的变量,可以用new关键字表示

2)在触发目标上执行delete操作后会有一个旧行,如果在触发事件中需要用到该旧行的变量,可以用old关键字表示

3)在触发目标上执行update操作后原纪录是旧行,新记录是新行,可以使用new和old关键字来分别操作

为了解释上面这句话,我们创建一个t2、t3、t4触发器:

CREATE TRIGGER t2

AFTER

INSERT

ON ord

FOR EACH ROW

BEGIN

UPDATE goods SET num=num-new.much WHERE gid=new.gid;

END

CREATE TRIGGER t3

AFTER

DELETE

ON ord

FOR EACH ROW

BEGIN

UPDATE goods SET num=num+old.much WHERE gid=old.gid;

END

CREATE TRIGGER t4

BEFORE

UPDATE

ON ord

FOR EACH ROW

BEGIN

UPDATE goods SET num=num+old.much-new.much WHERE gid = 1;

END

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值