触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

基本语法

在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器。

语法格式如下:

CREATE <触发器名> < BEFORE | AFTER >
<INSERT | UPDATE | DELETE >
ON <表名> FOR EACH Row<触发器主体>

语法说明如下。

1) 触发器名

触发器的名称,触发器在当前数据库中必须具有唯一的名称。如果要在某个特定数据库中创建,名称前面应该加上数据库的名称。

2) INSERT | UPDATE | DELETE

触发事件,用于指定激活触发器的语句的种类。

注意:三种触发器的执行时间如下。

  • INSERT:将新行插入表时激活触发器。例如,INSERT 的 BEFORE 触发器不仅能被 MySQL 的 INSERT 语句激活,也能被 LOAD DATA 语句激活。
  • DELETE: 从表中删除某一行数据时激活触发器,例如 DELETE 和 REPLACE 语句。
  • UPDATE:更改表中某一行数据时激活触发器,例如 UPDATE 语句。

3) BEFORE | AFTER

BEFORE 和 AFTER,触发器被触发的时刻,表示触发器是在激活它的语句之前或之后触发。若希望验证新数据是否满足条件,则使用 BEFORE 选项;若希望在激活触发器的语句执行之后完成几个或更多的改变,则通常使用 AFTER 选项。

4) 表名

与触发器相关联的表名,此表必须是永久性表,不能将触发器与临时表或视图关联起来。在该表上触发事件发生时才会激活触发器。同一个表不能拥有两个具有相同触发时刻和事件的触发器。例如,对于一张数据表,不能同时有两个 BEFORE UPDATE 触发器,但可以有一个 BEFORE UPDATE 触发器和一个 BEFORE INSERT 触发器,或一个 BEFORE UPDATE 触发器和一个 AFTER UPDATE 触发器。

5) 触发器主体

触发器动作主体,包含触发器激活时将要执行的 MySQL 语句。如果要执行多个语句,可使用 BEGIN…END 复合语句结构。

6) FOR EACH ROW

一般是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作。例如,使用 INSERT 语句向某个表中插入多行数据时,触发器会对每一行数据的插入都执行相应的触发器动作。

注意:每个表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 与 AFTER,因此每个表最多支持 6 个触发器。每个表的每个事件每次只允许有一个触发器。单一触发器不能与多个事件或多个表关联。

另外,在 MySQL 中,若需要查看数据库中已有的触发器,则可以使用 SHOW TRIGGERS 语句。

创建 BEFORE 类型触发器

在 test_db 数据库中,数据表 tb_emp8 为员工信息表,包含 id、name、deptId 和 salary 字段,数据表 tb_emp8 的表结构如下所示。

  mysql> SELECT * FROM tb_emp8;  Empty set (0.07 sec)  mysql> DESC tb_emp8;  +--------+-------------+------+-----+---------+-------+  | Field  | Type        | Null | Key | Default | Extra |  +--------+-------------+------+-----+---------+-------+  | id     | int(11)     | NO   | PRI | NULL    |       |  | name   | varchar(22) | YES  | UNI | NULL    |       |  | deptId | int(11)     | NO   | MUL | NULL    |       |  | salary | float       | YES  |     | 0       |       |  +--------+-------------+------+-----+---------+-------+  4 rows in set (0.05 sec)

【实例 1】创建一个名为 SumOfSalary 的触发器,触发的条件是向数据表 tb_emp8 中插入数据之前,对新插入的 salary 字段值进行求和计算。输入的 SQL 语句和执行过程如下所示。

  mysql> CREATE TRIGGER SumOfSalary      -> BEFORE INSERT ON tb_emp8      -> FOR EACH ROW      -> SET @sum=@sum+NEW.salary;  Query OK, 0 rows affected (0.35 sec)

触发器 SumOfSalary 创建完成之后,已经为大家精心准备了大数据的系统学习资料,从Linux-Hadoop-spark-......,需要的小伙伴可以点击向表 tb_emp8 中插入记录时,定义的 sum 值由 0 变成了 1500,即插入值 1000 和 500 的和,如下所示。

  SET @sum=0;  Query OK, 0 rows affected (0.05 sec)  mysql> INSERT INTO tb_emp8      -> VALUES(1,'A',1,1000),(2,'B',1,500);  Query OK, 2 rows affected (0.09 sec)  Records: 2  Duplicates: 0  Warnings: 0  mysql> SELECT @sum;  +------+  | @sum |  +------+  | 1500 |  +------+  1 row in set (0.03 sec)

创建 AFTER 类型触发器

在 test_db 数据库中,数据表 tb_emp6 和 tb_emp7 都为员工信息表,包含 id、name、deptId 和 salary 字段,数据表 tb_emp6 和 tb_emp7 的表结构如下所示。

  mysql> SELECT * FROM tb_emp6;  Empty set (0.07 sec)  mysql> SELECT * FROM tb_emp7;  Empty set (0.03 sec)  mysql> DESC tb_emp6;  +--------+-------------+------+-----+---------+-------+  | Field  | Type        | Null | Key | Default | Extra |  +--------+-------------+------+-----+---------+-------+  | id     | int(11)     | NO   | PRI | NULL    |       |  | name   | varchar(25) | YES  |     | NULL    |       |  | deptId | int(11)     | YES  | MUL | NULL    |       |  | salary | float       | YES  |     | NULL    |       |  +--------+-------------+------+-----+---------+-------+  4 rows in set (0.00 sec)  mysql> DESC tb_emp7;  +--------+-------------+------+-----+---------+-------+  | Field  | Type        | Null | Key | Default | Extra |  +--------+-------------+------+-----+---------+-------+  | id     | int(11)     | NO   | PRI | NULL    |       |  | name   | varchar(25) | YES  |     | NULL    |       |  | deptId | int(11)     | YES  |     | NULL    |       |  | salary | float       | YES  |     | 0       |       |  +--------+-------------+------+-----+---------+-------+  4 rows in set (0.04 sec)

【实例 2】创建一个名为 double_salary 的触发器,触发的条件是向数据表 tb_emp6 中插入数据之后,再向数据表 tb_emp7 中插入相同的数据,并且 salary 为 tb_emp6 中新插入的 salary 字段值的 2 倍。输入的 SQL 语句和执行过程如下所示。

  mysql> CREATE TRIGGER double_salary      -> AFTER INSERT ON tb_emp6      -> FOR EACH ROW      -> INSERT INTO tb_emp7      -> VALUES (NEW.id,NEW.name,deptId,2*NEW.salary);  Query OK, 0 rows affected (0.25 sec)

触发器 double_salary 创建完成之后,向表 tb_emp6 中插入记录时,同时向表 tb_emp7 中插入相同的记录,并且 salary 字段为 tb_emp6 中 salary 字段值的 2 倍,如下所示。

  mysql> INSERT INTO tb_emp6      -> VALUES (1,'A',1,1000),(2,'B',1,500);  Query OK, 2 rows affected (0.09 sec)  Records: 2  Duplicates: 0  Warnings: 0  mysql> SELECT * FROM tb_emp6;  +----+------+--------+--------+  | id | name | deptId | salary |  +----+------+--------+--------+  |  1 | A    |      1 |   1000 |  |  2 | B    |      1 |    500 |  +----+------+--------+--------+  3 rows in set (0.04 sec)  mysql> SELECT * FROM tb_emp7;  +----+------+--------+--------+  | id | name | deptId | salary |  +----+------+--------+--------+  |  1 | A    |      1 |   2000 |  |  2 | B    |      1 |   1000 |  +----+------+--------+--------+  2 rows in set (0.06 sec)

MySQL创建触发器(CREATE TRIGGER)相关推荐

  1. mysql 创建触发器(for each row解释)

    说明:这里只是一个简单的示例. 假设系统中有两个表: 班级表 class(班级号 class_id, 班内学生数 stu_count) 学生表 student(学号 stu_id, 所属班级号 cla ...

  2. mysql创建触发器难题_[]MYSQL创建触发器遇到很奇怪的有关问题

    [求助]mysql创建触发器遇到很奇怪的问题. 今天遇到一个很奇怪的问题,是关于创建触发器的.创建触发器代码如下 SQL code create trigger trigger_t_test_U af ...

  3. mysql 触发器采坑记录(mysql 触发器采坑记录 由于不了解mysql创建触发器要记录创建者IP,导致更改创建者IP后,触发器不可执行。 当创建触发器(视图、存储过程、函数)时,如果没有)

    mysql 触发器采坑记录(语序有点凌乱,回头再整理) 由于不了解mysql创建触发器要记录创建者IP,导致更改创建者IP后,触发器不可执行. 当创建触发器(视图.存储过程.函数)时,如果没有指定创建 ...

  4. mysql创建触发器

    新增数据: #创建t_basic_cqc表新增数据触发器 CREATE TRIGGER t_basic_cqc_insert AFTER INSERT ON t_basic_cqc FOR EACH ...

  5. Mysql创建触发器实现不同表的插入、更新、删除操作

    说明:Mysql5.0以上的版本才支持下面的操作. Mysql 触发器的插入.更新.删除操作. 在这里建了两个表:其中这两个表的结构不一样,这里给表admin建立触发器 在对表admin操作的同时,触 ...

  6. MySQL 创建触发器

    触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合. 基本语法 在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器. 语 ...

  7. mysql 创建触发器出错_mysql-在phpmyadmin中创建触发器时出错

    我创建了非常简单的触发器,我认为syntex也正确: CREATE TRIGGER trig1 after INSERT ON urlcontent for each row BEGIN insert ...

  8. navicat for mysql创建触发器_在navicat for mysql中建立触发器

    Mysql的触发器(trigger):监视某种操作,并触发另一种操作.简要说:对表M的操作A触发了对表N的操作B. 触发器创建语法四要素: 1..引发对象(哪一张表引发的?也就是说表M是谁?) 2.触 ...

  9. mysql创建触发器的权限_MYSQL设置触发器权限问题的解决方法

    本文实例讲述了MYSQL设置触发器权限的方法,针对权限错误的情况非常实用.具体分析如下: mysql导入数据提示没有SUPER Privilege权限处理,如下所示: ERROR 1419 (HY00 ...

最新文章

  1. 商汤AI小学教材来了,动动手玩乐高就能搭建机器人
  2. 计算机房电磁辐射防护,计算机房电磁屏蔽
  3. java mac sh_如何创建AppleScript或Command文件以在Mac OS上启动Java应用程序?
  4. 小白的算法初识课堂(part1)--二分查找法
  5. oracle中创建游标,oracle 存储过程创建游标
  6. nodejs文件写入
  7. Android自定义控件学习(二)-----自定义attr Style styleable以及其应用
  8. 时间戳转为时间友好显示
  9. python坦克大战小游戏,打包为exe文件
  10. 电子技术基础(数字部分)(第六版) 康华光 课后习题答案
  11. android 2.1你好八月,八月你好优美句子
  12. python找零方案_从自动贩卖机找零看Python中的动态规划问题
  13. 模型可视化工具Netron手把手教学
  14. PHP设计模式之观察者模式
  15. VB编程:数组中删除数组元素-27
  16. uni-app H5 的下载,如何实现
  17. 行路难,行路难,多歧路,今安在?
  18. 地理坐标转换 - 地理信息系统(3)
  19. react实现div隐藏_React 点击按钮显示div与隐藏div
  20. 基于asp.net护肤化妆品销售网站的设计与开发

热门文章

  1. DayDayUp:今天早上看到一条朋友圈——《吃苦与穷的深刻认知》
  2. TF之NN:利用神经网络系统自动学习散点(二次函数+noise+优化修正)输出结果可视化(matplotlib动态演示)
  3. java数据结构至对称矩阵压缩存储
  4. mysql(connector/ODBC)
  5. Windows Mobile 6.5.3 Developer Tool Kit
  6. 明早1点去青岛,可能要两天不能写博客了
  7. 气死我的存储过程和用户定义函数
  8. 蓝牙4.0 vs 蓝牙4.1 vs 蓝牙4.2 vs 蓝牙5.0
  9. V3S代码整合中遇到的一个奇怪问题
  10. RV1108开发环境搭建