MySQL触发器语法与创建应用详解
本文详细解析 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 进阶技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









