MySQL 使用触发器

前言:MySQL5以上的版本支持触发器功能

什么是触发器:如果你想要某条语句在事件发生时自动执行,就需要用到触发器,确切的说触发器是MySQL响应以下任一语句而自动执行的一条MySQL语句(位于BEGIN和END语句之间的一组语句):DELETE、INSERT、UPDATE,其他MySQL语句不支持触发器

INSERT型触发器 :插入某一行时激活触发器,可能INSERT语句触发。
UPDATE型触发器 : 更改某一行时激活触发器,可能通过UPDATE语句触发。
DELETE型触发器 : 删除某一行时激活触发器,可能通过DELETE语句触发
 

一、创建触发器

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

每个触发器对应一张表,每张表最多支持6个触发器(DELETE、INSERT、UPDATE之前和之后)

CREATE TRIGGER newproduct AFTER INSERT ON orders -- 创建一个触发器对应orders表
FOR EACH ROW -- 这句话在mysql是固定的
BEGIN
-- 触发器sql语句
END;

同时使用Navicat for MySQL创建触发器方法如下图所示,但是建议使用语句操作。首先在Navicat for MySQL找到需要建立触发器对应的表,右键“设计表”,然后创建触发器。

二、删除触发器

DROP TRIGGER newproduct;

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

 

三、使用触发器

      1、INSERT触发器(在INSERT触发器代码内,可以引用一个名为NEW的虚拟表,访问被插入的行)

       每当新增一个订单,将这个的订单新增到到总价表备用。

CREATE TRIGGER ordersinsert AFTER INSERT ON orders
FOR EACH ROW #这句话在mysql是固定的
BEGIN
-- 触发器sql语句
INSERT INTO ordertotals(order_num, total)  
values(NEW.order_num, 0);  
END;

 

2、DELETE触发器(在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,访问被删除的行。OLD的值是只读的,不能更新)

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

CREATE TRIGGER orderdelete BEFORE DELETE ON orders
FOR EACH ROW #这句话在mysql是固定的
BEGIN
-- 触发器sql语句
INSERT INTO archive_orders(order_num, order_date,cust_id)  
values(OLD.order_num,OLD.order_date,OLD.cust_id);  
END;

使用BEFORE的原因:如果由于某种原因,订单不能存档,则DELETE操作将被放弃

 

3、UPDATE触发器(在UPDATE触发器内,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个NEW的虚拟表访问新更新的值、OLD的值是只读的,不能更新)

每次更新时,vend_state需要替换成大写

CREATE TRIGGER vendorupdate BEFORE UPDATE ON vendors
FOR EACH ROW #这句话在mysql是固定的
BEGIN
-- 触发器sql语句
SET NEW.vend_state = Upper(NEW.vend_state);
END;

 

总结:

    1、触发器不支持CALL语句,这表示不能从触发器内调用存储过程

    2、触发器分3种,每一种对应两个状态BEFORE和AFTER

    3、 DELETE触发器引用OLD(访问被删除的行)、INSERT触发器引用NEW(访问被插入的行)、UPDATE触发器引用可以引用              OLD(更新前)和NEW(更新后)

     4、存储过程最大问题就是给数据库开发工作压力太大,另外架构升级时候会比较难解耦;
        触发器不推荐使用,触发操作能在业务层解决就在业务层解决,否则很难维护,而且容易产生死锁。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值