Mysql学习——触发器

一、触发器的定义

触发器是一类特殊的事务,可以监视某种数据操作(insert/delete/update),并触发相应操作(insert/delete/update)。

使用场景:

1、当向一张表中添加或删除记录时,需要在相关表中进行同步操作

2、当表上某列数据的值与其他表中的数据有联系时。

3、当需要对某张表进行跟踪时


二、触发器创建语法 —— 4要素

1、监视地点  table

2、监视事件  insert/update/delete

3、触发时间 after/before

4、触发事件 insert/update/delete

创建触发器的语法:

create trigger 触发器名称 

after/before (触发时间)

insert/update/delete (监视事件)

on 表名 (监视地址)

for each row

begin

sql1;

..

sqlN;

end;

设置mysql 最外层分割符  delimiter  $

查看已有触发器: show triggers

删除已有触发器:drop trigger  触发器名称

例子:

通过监视订单表的新增订单,减少商品表中对应商品的库存

商品表:

CREATE TABLE `good` (
  `gid` int(11) NOT NULL,
  `name` varchar(10) NOT NULL,
  `num` smallint(6) DEFAULT NULL,
  PRIMARY KEY (`gid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

订单
表:

CREATE TABLE `ord` (
  `gid` int(11) DEFAULT NULL,
  `orderid` int(11) DEFAULT NULL,
  `much` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

建立监听器: new  对应新行   old  对应旧行

delimiter  $

create trigger good_num_trigger

after

insert

on ord

for each row

begin

update good set num = num - new.much where gid = new.gid;

end$


create trigger good_add_num

after

delete

on ord

for each row

begin

update good set num = num+old.much where gid =old.gid;

end$

delimiter  ;


建立监听器:在订单订购数量改变时,更新商品库存表中的库存 new  对应新行   old  对应旧行

delimiter  $

create trigger ord_update_much

before

update

on ord

for each row

begin

update good set num = num+old.much -new.much where gid =new.gid;

end$

delimiter  ;


建立监听器:判断插入的订单的much  是否大于订购商品的库存,如果大于库存,则调整该订单的订购数量为当前商品库存

delimiter  $

create trigger ord_check_much

before

insert

on ord

for each row

begin

declare 

rnum int;

select num into rnum from good where gid = new.gid;

if new.much > rnum then

set new.much = rnum;

end if;

update good set num = num -new.much where gid = new.gid;

end$

delimiter  ;


注意:for each row 在mysql 中的监听器必须有,在其他数据库中比如oracle中的监听器是可以缺失的

1、如果有 for each row ,则是行级监听器

执行的语句操作了n行数据,则该监听器被调用n次。

2、如果没有for each row,则是语句级监听器

按照监听到的语句数量,调用监听器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值