目录

一、概述

二、创建触发器

三、查看触发器

四、删除触发器

五、使用触发器

1.INSERT触发器

2.DELETE触发器

3.UPDATE触发器

4.包含多条执行语句【BEGIN...END】

六、对触发器的进一步说明


一、概述

触发器是一个被关联到一个表的数据库对象,当该表的特定事件发生时,它才会被触发

触发器与表的联系十分密切,用于保护数据库中数据的完整性和多个表之间数据的一致性

如:

  • 增加一个用户信息到数据库中的基本信息表时,检查其电话号码格式是否正确
  • 当用户订购一个产品时,要从产品库存量减去订购的数量

二、创建触发器

格式:

CREATE TRIGGER 触发器名 触发时间 触发事件 ON 表名 FOR EACH ROW 触发器动作主体
  • 触发时间:BEFORE和AFTER
  • BEFORE:触发器是在激活它的语句之前触发
  • AFTER:触发器是在激活它的语句之后触发
  • 触发事件:INSERT、UPDATE和DELETE
  • INSERT:向表中插入新行时激活触发器
  • UPDATE:更改表中某一行时激活触发器
  • DELETE:从表中删除某一行时激活触发器
  • 表名:一个表中不能同时有两个BEFORE UPDATE触发器,可以有一个BEFORE UPDATE 和 BEFORE INSERT触发器 或者 BEFORE UPDATE 和 AFTER UPDATE触发器
  • FOR EACH ROW:用来指定受触发事件影响的每一行都要激活触发器的动作
  • 触发器动作主体:包含触发器被激活时要执行的SQL语句【多个语句可用BEGIN...END复合语句结构---详情请看第五节-使用触发器
  • 注意:
  • 每个表每个事件只允许一个触发器
  • 每个表最多支持6个触发器【INSERT、UPDATE、DELETE的之前与之后】

Example:

MySQL的视图触发器存储过程 mysql触发器执行顺序_database

  • Explanation:
  • 每次向student 表中插入一行数据后将student变量[-变量名自定义-]设置为“add new student”

        

三、查看触发器

格式:

SHOW TRIGGERS [FROM 表名] [\G];

Example:

MySQL的视图触发器存储过程 mysql触发器执行顺序_database_02

  • Trigger:触发器名
  • Event:触发事件
  • Table:表名
  • Statement:触发动作
  • Timing:触发时间
  • Created:触发器创建时间

四、删除触发器

格式:

DROP TRIGGER [IF EXISTS] 触发器名;

Example:

MySQL的视图触发器存储过程 mysql触发器执行顺序_sql_03

 注意:

  • 删除一个表的同时会自动删除该表上的触发器
  • 触发器不能更新或覆盖,如果要修改触发器,必须先删除后再重新创建

五、使用触发器

1.INSERT触发器

格式:

CREATE TRIGGER 触发器名 BEFORE/AFTER INSERT ON 表名 FOR EACH ROW 触发器动作主体
  • INSERT触发器代码内可引用一个名为NEW的虚拟表访问被插入的行
  • BEFORE INSERT触发器中NEW中的值也可以被更新,即允许更改被插入的值
  • 对于约束为AUTO_INCREMENT列,NEW在INSERT执行之前包含的是0,插入之后包含新的自动生成值 

Example:

1.简单了解

MySQL的视图触发器存储过程 mysql触发器执行顺序_触发器_04


MySQL的视图触发器存储过程 mysql触发器执行顺序_database_05

 2.关于名为NEW的虚拟表

MySQL的视图触发器存储过程 mysql触发器执行顺序_数据库_06


MySQL的视图触发器存储过程 mysql触发器执行顺序_数据库_07

2.DELETE触发器

格式:

CREATE TRIGGER 触发器名 BEFORE/AFTER DELETE ON 表名 FOR EACH ROW 触发器动作主体
  • DELETE触发器代码内可引用一个名为OLD的虚拟表访问被删除的行
  • OLD的值全部是只读的,不能被更新

Example:

1.简单了解

MySQL的视图触发器存储过程 mysql触发器执行顺序_数据库_08


 

MySQL的视图触发器存储过程 mysql触发器执行顺序_sql_09

 2.关于名为OLD的虚拟表

 

MySQL的视图触发器存储过程 mysql触发器执行顺序_MySQL的视图触发器存储过程_10


MySQL的视图触发器存储过程 mysql触发器执行顺序_sql_11

3.UPDATE触发器

格式:

CREATE TRIGGER 触发器名 BEFORE/AFTER UPDATE ON 表名 FOR EACH ROW 触发器动作主体
  • UPDATE触发器代码内可引用一个名为OLD的虚拟表来访问UPDATE语句执行前的值,也可以引用一个名为NEW的虚拟表来访问新更新的值
  • BEFORE UPDATE触发器中,NEW中的值可能也被更新,即允许更改将要用于UPDATE语句中的值
  • OLD的值全部是只读的,不能被更新
  • 当触发器涉及对表自身的更新操作时,只能使用BEFORE UPDATE触发器,而AFTER UPDATE触发器将不被允许

Example:

MySQL的视图触发器存储过程 mysql触发器执行顺序_sql_12


MySQL的视图触发器存储过程 mysql触发器执行顺序_MySQL的视图触发器存储过程_13

4.包含多条执行语句【BEGIN...END】

MySQL的视图触发器存储过程 mysql触发器执行顺序_MySQL的视图触发器存储过程_14



分号一般作为SQL语句的结束符号,但在触发器中,要执行多条语句时就很不方便,所以可以利用关键字DELIMITER来实现多条SQL语句的执行

结构如下:

  • DELIMITER $$
  • $$ DELIMITER;


  • 如有无法退出的情况发生,输入$$+按下回车键即可

MySQL的视图触发器存储过程 mysql触发器执行顺序_触发器_15

MySQL的视图触发器存储过程 mysql触发器执行顺序_database_16

六、对触发器的进一步说明

  • 目前MySql版本所支持的触发器还比较初级
  • 创建触发器可能需要特殊的安全访问权限,但触发器的执行是自动的
  • 应该多用触发器保证数据的一致性,完整性和正确性
  • 创建跟踪——可使用触发器把更改之前和更改之后的状态记录到另一张表中