MySQL的触发器的原理是什么

60次阅读
没有评论

共计 2879 个字符,预计需要花费 8 分钟才能阅读完成。

自动写代码机器人,免费开通

这期内容当中丸趣 TV 小编将会给大家带来有关 MySQL 的触发器的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1、触发器的概念

触发器(trigger)是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。——百度百科

上面是百度给的触发器的概念,我理解的触发器的概念,就是你执行一条 sql 语句,这条 sql 语句的执行会自动去触发执行其他的 sql 语句,就这么简单。

超简说明:sql1- 触发 - sqlN,一条 sql 触发多个 sql

2、触发器创建的四个要素

(1)监视地点(table)
(2)监视事件(insert/update/delete)
(3)触发时间(after/before)
(4)触发事件(insert/update/delete)

3、创建触发器

需求:在下订单的时候,对应的商品的库存量要相应的减少,即买几个商品就减少多少个库存量。

订单表: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 
after
insert 
on ord
for each row
begin
 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 执行结束标志,默认为;

4、查看和删除已有的触发器

(1)查看已有触发器:show triggers
(2)删除已有触发器:drop trigger triggerName

5、触发器中引用行变量

(1)在触发目标上执行 insert 操作后会有一个新行,如果在触发事件中需要用到这个新行的变量,可以用 new 关键字表示
(2)在触发目标上执行 delete 操作后会有一个旧行,如果在触发事件中需要用到这个旧行的变量,可以用 old 关键字表示
(3)在触发目标上执行 update 操作后原纪录是旧行,新记录是新行,可以使用 new 和 old 关键字来分别操作

当下订单时减少相应的货品的库存量,创建触发器:

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 = new.gid;
end$

6、after 和 before 的区别

after 操作,是在执行了监视动作后,才会执行触发事件
before 操作,是在执行了监视动作前,会执行触发事件
两者在一般的触发器中并没有什么区别,但是有的时候有区别,如:

需求:在用户定了超过库存的订单后,会修改该订单的订购数量,使订购数量的最大值和库存量相同 分析:首先判断 订购量 库存量,然后做将订购量改为库存量

创建触发器:

create trigger t5
before
insert 
on ord
for each row
begin
 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 操作。

7、for each row 是干什么的?

在 oracle 触发器中,触发器分为行触发器和语句触发器

比如:

create trigger tn
after
update
on xxtable
for each row # 每一行受影响,触发事件都执行,叫做行触发器
begin
 sqlN;
end$

执行:

update xxtable set xxx=xxx where id

该修改操作假设 100 行,那么 sqlN,会触发多少次?答案:会触发 100 次。

拓展:

在 oracle 中,for each row 如果不写,无论 update 语句一次影响了多少行,都只执行一次触发事件。
比如:1 人下了订单,买了 5 件商品,insert 5 次,可以用行级触发器,修改 5 次库存;用语句级触发器触发,insert 一条发货提醒。

上述就是丸趣 TV 小编为大家分享的 MySQL 的触发器的原理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2879字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)