您现在的位置是:群英 > 数据库 > MySQL数据库
MySQL中的触发器是什么,如何创建、删除和使用触发器?
Admin发表于 2021-11-25 17:47:571643 次浏览

    这篇文章给大家分享的是MySQL中的触发器的相关。小编觉得挺实用的,因此分享给大家做个参考,文中介绍了创建、删除和使用触发器等等,感兴趣的朋友接下来一起跟随小编看看吧。

1. 触发器

    ​ MySQL语句在需要时被执行,存储过程也是如此。但是,如果你想要某条语句在事件发生时自动执行,怎么办?例如:​

  • 每当增加一个顾客到某个数据库时,都检查其电话号码格式是否正确,州的缩写是否大写;
  • 每当订购一个产品时,都从库存数量中减去订购的数量;
  • 无论何时删除一行,都在某个存档表中保留一个副本。

​     所有这些例子的共同之处是它们都需要在某个表发生更改时自动处理。这确切地说就是触发器。触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):

  • DELETE;
  • INSERT;
  • UPDATE。

    其他MySQL语句不支持触发器。

2. 创建触发器

    在创建触发器时,需要给出4条信息:

  • 唯一的触发器名;
  • 触发器关联的表;
  • 触发器应该响应的活动(DELETE、INSERT或UPDATE);
  • 触发器何时执行(处理之前或之后)

    触发器用CREATE TRIGGER语句创建。下面是一个简单的例子:

    输入:

CREATE TRIGGER newproduct AFTER INSERT INTO ON products
FOR EACH ROW SELECT 'Product added';

    分析CREATE TRIGGER 用来创建名为newproduct的触发器。触发器可在一个操作发生之前或之后执行,这里给出了AFTER INSERT,所以此触发器将在INSERT语句成功执行后执行。这个触发器还指定FOREACH ROW,因此代码对每个插入行执行。在这个例子中,文本Product added 将对每个插入的行显示一次。

​     为了测试这个触发器,使用INSERT语句添加一行或多行到products中,你将看到对每个成功的插入,显示Product added消息。

仅支持表 只有表才支持触发器,视图不支持(临时表也不支持)

    ​ 触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条INSERTUPDATEDELETE的之前和之后)。单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对INSERTUPDATE操作执行的触发器,则应该定义两个触发器。

触发器失败 如果BEFORE触发器失败,则MySQL将不执行请求的操作。此外,如果BEFORE触发器或语句本身失败,MySQL将不执行AFTER触发器(如果有的话)。

3. 删除触发器

​     现在,删除触发器的语法应该很明显了。为了删除一个触发器,可使用DROP TRIGGER语句,如下所示:

    输入:DROP TRIGGER newproduct;

    分析:触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。

4. 使用触发器

    ​ 在有了前面的基础知识后,我们现在来看所支持的每种触发器类型以及它们的差别。

4.1 INSERT触发器

​     INSERT触发器在INSERT语句执行之前或之后执行。需要知道以下几点:

  • INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;
  • BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值);
  • 对于AUTO_INCREMENT列,NEWINSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。

​     下面举一个例子。AUTO_INCREMENT列具有MySQL自动赋予的值。第21章建议了几种确定新生成值的方法,但下面是一种更好的方法:

    输入:

CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num;

    分析:此代码创建一个名为neworder的触发器,它按照AFTER INSERT ON orders执行。在插入一个新订单到orders表时,MySQL生成一个新订单号并保存到order_num中。触发器从NEW. order_num取得这个值并返回它。此触发器必须按照AFTER INSERT执行,因为在BEFORE INSERT语句执行之前,新order_num还没有生成。对于orders的每次插入使用这个触发器将总是返回新的订单号。

    ​ 为了测试这个触发器,试着插入一下新行,如下所示:

    输入:

INSERT INTO orders(order_date,cust_id)
VALUES(Now(),10001);

    输出:

order_num
20010

    分析: orders包含3个列。order_datecust_id必须给出,order_num由MySQL自动生成,而现在order_num还自动被返回。

BEFORE或AFTER? 通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)。本提示也适用于UPDATE触发器。

    4.2 DELETE触发器

    ​ DELETE触发器在DELETE语句执行之前或之后执行。需要知道以下两点:

  • DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行;
  • OLD中的值全都是只读的,不能更新。

    ​ 下面的例子演示使用OLD保存将要被删除的行到一个存档表中:

    输入:

CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
    INSERT INTO archive_orders(order_num,order_date,cust_id)
    VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
END;

    分析: 在任意订单被删除前将执行此触发器。它使用一条INSERT语句将OLD中的值(要被删除的订单)保存到一个名为archive_orders的存档表中(为了实际使用这个例子,你需要用与orders相同的列创建一个名为archive_orders的表)。

​     使用BEFORE DELETE触发器的有点(相对于AFTER DELETE触发器来说)为,如果由于某种原因,订单不能存档,DELETE本身将被放弃。

    4.3 UPDATE触发器

​     UPDATE触发器在UPDATE语句执行之前或之后执行。需要知道以下几点:

  • UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
  • BEFORE UPDATE触发器中,NEW中的值也可能被更新(允许更改将要用于UPDATE语句中的值);
  • OLD中的值全部都是只读的,不能更新。

    ​ 下面的例子保证州名总是大写(不管UPDATE语句中给出的是大写还是小写);

    输入:

CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);

    分析:显然任何数据净化都需要在UPDATE语句之前进行,就想这个例子中一样。每次更新一个行时,NEW.vend_state中的值(将用来更新表行的值)都用Upper(NEW.vend_state)替换。

    关于MySQL中的触发器的内容就介绍到这,现在如何创建、删除和使用触发器应该都有清楚了吧,对于SQL语句具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家学习MySQL数据库有帮助,想要了解更多大家可以关注其它的相关文章。

文本转载自网络

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: mysql触发器
相关信息推荐
2022-07-13 17:42:53 
摘要:这篇文章主要介绍了ORACLE数据库中ROWNUM用法详解,对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,且rownum不能以任何表的名称作为前缀,需要的朋友们下面随着小编来一起学习学习吧
2022-10-24 09:24:07 
摘要:mysql存储过程中的循环语句有三种:1、WHILE循环语句,语法“WHILE 条件表达式 DO 循环语句 END WHILE”;2、REPEAT循环语句,语法“REPEAT 循环语句 UNTIL 条件表达式 END REPEAT”;3、LOOP循环语句,语法“[begin_label:] LOOP 条件和循环语句列表 END LOOP [end_label]”。
2022-06-15 17:45:21 
摘要:这篇文章要给大家介绍的是oracle索引,索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。 感兴趣的小伙伴可参考一下
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部