MySQL触发器语法与创建应用详解

阿澈
阿澈
发布时间:2026-10-15 | 6人浏览过
原创

本文详细解析 MySQL 5.7 中触发器的基本语法,涵盖 CREATE TRIGGER 语句的组成部分及执行时机。通过两个具体实例演示如何创建 BEFORE 型触发器进行数据求和校验,以及 AFTER 型触发器实现跨表数据同步与数值转换,帮助掌握触发器在数据完整性控制中的应用。

触发器基本语法

在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器。触发器是与表事件关联的存储过程,当特定操作发生时自动执行。其基本语法结构如下:

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

关键参数说明

  • 触发器名:在当前数据库中必须唯一。若需指定数据库,名称前应加上数据库名(如 test_db.trigger_name)。
  • 触发事件:INSERT、UPDATE 或 DELETE。
    • INSERT:插入新行时激活,也适用于 LOAD DATA 语句。
    • DELETE:删除某一行时激活,适用于 DELETE 和 REPLACE 语句。
    • UPDATE:修改某一行数据时激活,适用于 UPDATE 语句。
  • 触发时刻:BEFORE 表示在事件发生前执行,常用于数据校验;AFTER 表示在事件发生后执行,常用于数据关联处理或审计日志记录。
  • 表名:必须是永久性表,不能关联临时表或视图。同一表的同一时刻和事件只能有一个触发器,但一个表最多可拥有 6 个触发器(每个事件的 BEFORE 和 AFTER)。
  • FOR EACH ROW:表示行级触发,受影响的每一行都会执行触发器动作。
  • 触发器主体:包含要执行的 SQL 语句。若需执行多条语句,应使用 BEGIN ... END 复合语句包裹。

提示:可使用 SHOW TRIGGERS 语句查看当前数据库中已存在的触发器信息。

创建 BEFORE 类型触发器实例

本实例演示如何使用 BEFORE INSERT 触发器在插入数据前对薪资字段进行累加计算。环境基于 test_db 数据库中的 tb_emp8 员工表。

第1步:准备测试表结构

首先确认表 tb_emp8 的结构,包含 id、name、deptId 和 salary 字段:

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)

第2步:创建求和触发器

创建一个名为 SumOfSalary 的触发器,在插入数据前将新记录的薪资值累加到用户变量 @sum 中:

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)

第3步:验证触发器效果

初始化变量并插入两条记录,检查变量值是否为插入薪资之和:

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)

结果显示 @sum 为 1500,成功实现了插入前的薪资累加。

创建 AFTER 类型触发器实例

本实例演示如何使用 AFTER INSERT 触发器实现跨表数据同步。当主表插入数据后,自动向从表插入对应的双倍薪资记录。环境涉及 tb_emp6(主表)和 tb_emp7(从表)。

第1步:确认双表结构

查看两张员工信息表的结构,确保字段兼容:

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 插入同名同部门但薪资翻倍的数据:

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

注意:原草稿代码中缺少 NEW 关键字指向 deptId,此处修正为 NEW.deptId 以确保逻辑正确。

第3步:验证跨表同步

向主表 tb_emp6 插入数据,观察从表 tb_emp7 是否自动生成双倍薪资记录:

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)

结果可见,tb_emp7 中的薪资分别为 2000 和 1000,准确反映了主表薪资的两倍,触发器工作正常。

总结

触发器是 MySQL 中用于自动化数据处理的强大工具。BEFORE 触发器适合用于数据录入前的清洗与校验,而 AFTER 触发器则常用于数据变更后的关联更新或日志记录。在实际开发中,应注意触发器性能影响,避免过度嵌套或复杂逻辑导致数据库负载过高。以上就是 MySQL 触发器语法与创建应用的详细内容,更多关于 MySQL 进阶技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表