MySQL使用触发器 Mysql触发器的创建与使用方法

时间:2021-11-25

前言: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找到需要建立触发器对应的表,右键“设计表”,然后创建触发器。

创建触发器

二、删除触发器

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

三、使用触发器

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

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

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、存储过程最大问题就是给数据库开发工作压力太大,另外架构升级时候会比较难解耦;

触发器不推荐使用,触发操作能在业务层解决就在业务层解决,否则很难维护,而且容易产生死锁。

    收藏