什么是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,当然,实际开发过程中减去的具体值,需要是订单购买数量值),看如下过程:

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

触发器创建的四个要素
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

 

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值