MySQL触发器概念、原理与用法详解

 更新时间:2019年07月05日 11:09:39   作者:webbc  
这篇文章主要介绍了MySQL触发器概念、原理与用法,结合实例形势详细分析了mysql触发器相关概念、原理、创建、用法及操作注意事项,需要的朋友可以参考下

本文实例讲述了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;

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

拓展:

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

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总

希望本文所述对大家MySQL数据库计有所帮助。

相关文章

  • MySQL的索引和复合索引的实现

    MySQL的索引和复合索引的实现

    在数据库中,索引是一种特殊的数据结构,它可以帮助我们快速地查询和检索数据,本文主要介绍了MySQL的索引和复合索引的实现,感兴趣的可以了解一下
    2023-11-11
  • MySQL中复制表结构及其数据的5种方式

    MySQL中复制表结构及其数据的5种方式

    在MySQL中,复制表结构及其数据可以通过多种方式实现,每种方法都有其适用场景,选择合适的方法可以提高工作效率,注意处理目标表存在性、大表复制效率及外键等约束,感兴趣的可以了解一下
    2024-09-09
  • MySQL to_date()日期转换的用法及注意事项

    MySQL to_date()日期转换的用法及注意事项

    这篇文章主要介绍了MySQL to_date()日期转换的用法及注意事项,TO_DATE()函数在不同数据库系统中用于将字符串转换为日期格式,其语法和参数可能有所不同,需要的朋友可以参考下
    2025-01-01
  • 在centos7下安装和部署java8和mysql

    在centos7下安装和部署java8和mysql

    一般学习java和部署项目都是在本地部署,但是生产环境一般都是在linux环境下,部署和安装环境都是在控制台下进行操作的,没有windows的可视化的操作界面,对与linux的命令掌握和操作对小白来说都是一个个挑战,记录下自己的安装配置过程
    2017-04-04
  • 出现错误mysql Table ''performance_schema...解决办法

    出现错误mysql Table ''performance_schema...解决办法

    这篇文章主要介绍了解决出现错误mysql Table 'performance_schema.session_variables' doesn't exist的相关资料,需要的朋友可以参考下
    2017-04-04
  • MySQL数据库索引以及失效场景详解

    MySQL数据库索引以及失效场景详解

    索引是一种数据结构,为了应对不同的场景会有多种实现,下面这篇文章主要给大家介绍了关于MySQL数据库索引以及失效场景的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • MySQL实战教程之Join语句执行流程

    MySQL实战教程之Join语句执行流程

    这篇文章主要介绍了MySQL Join语句执行流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • MySQL中锁的相关问题

    MySQL中锁的相关问题

    这篇文章主要介绍了MySQL中锁的相关问题,本文给大家介绍了从对数据操作的粒度分 ,从对数据操作的类型分,给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • InnoDB数据库死锁问题处理

    InnoDB数据库死锁问题处理

    本文给大家讲解的是mysql数据库InnoDB类型,在update表的时候出现死锁现象的原因及解决办法,有需要的小伙伴可以参考下。
    2016-03-03
  • MySQL存储过程输入参数(in),输出参数(out),输入输出参数(inout)

    MySQL存储过程输入参数(in),输出参数(out),输入输出参数(inout)

    这篇文章主要介绍了MySQL存储过程输入参数(in),输出参数(out),输入输出参数(inout),存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;Python里面的函数
    2022-07-07

最新评论