【MySQL必知必会(二十一)】【使用触发器】

上一篇:【MySQL必知必会(二十)】【使用游标】

+++++++++++++开始线++++++++++++++++

一、 触发器

需要MySQL 5及以后的版本。

MySQL语句在需要时被执行,存储过程也是如此。但是如果想要某条语句在事件发生时自动执行,就需要使用触发器。在某个表发生更改时自动处理,这就是触发器。

触发器是MySQL响应以下任何语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):DELETE;INSERT;UPDATE,其他语句不支持触发器。

二、 创建触发器

创建触发器需要4条信息:
1.唯一的触发器名
2.触发器关联的表
3.触发器应该响应的活动(DELETE;INSERT;UPDATE)
4.触发器什么时候执行

保持每个数据库的触发器名唯一

在MySQL5中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一。这表示同一数据库中的两个表可具有相同名字的触发器。这在其他每个数据库触发器名必须唯一的DBMS中是不允许的,而且以后的MySQL版本很可能会使命名规则更为严格。因此,现在最好是在数据库范围内使用唯一的触发器名。

触发器用CREATE TRIGGER语句创建

mysql> CREATE TRIGGER newproduct AFTER INSERT ON products
    -> FOR EACH ROW SELECT 'Product added' INTO @asd;

分析

AFTER INSERT,此触发器将在INSERT语句成功执行后执行 FOR EACH ROW,对每个插入行执行 'Product
added’将对每个插入的行显示一次

MYSQL5以后,不允许触发器返回任何结果,因此使用into @变量名,将结果赋值到变量中,用select调用即可

仅支持表

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

在这里插入图片描述

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

三、 删除触发器

使用DROP TRIGGER语句

mysql> DROP TRIGGER newproduct;

四、 使用触发器

4.1 INSERT触发器

INSERT触发器在INSERT语句执行之前或之后执行。

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

 mysql> CREATE TRIGGER neworder AFTER INSERT ON orders
    -> FOR EACH ROW SELECT NEW.order_num INTO @abc;

分析

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

测试

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

在这里插入图片描述

4.2 DELETE触发器

DELETE触发器在DELETE语句执行之前或之后执行。

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

mysql> DELIMITER //
mysql> 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的存档表中。

4.3 UPDATE触发器

UPDATE触发器在UPDATE语句执行之前或之后执行。

1.在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前的值,引用一个名为NEW的虚拟表访问新更新的值
2.在BEFORE UPDATE触发器中,NEW中的值可能也被更新
3.OLD中的值全都是只读,不能更新

mysql> CREATE TRIGGER updateevendor BEFORE UPDATE ON vendors
    -> FOR EACH ROW SET NEW.vend_state = Upper(New.vend_state);

分析

任何数据净化都需要在UPDATE语句之前进行,每次更新一行,New.vend_state中的值都用Upper(New.vend_state)替换

+++++++++++++结束线++++++++++++++++

下一篇:【MySQL必知必会(二十二)】【管理事务处理】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值