MySQL-触发器

1.触发器概述

MySQL从5.0.2版本开始支持触发器,MySQL的触发器和存储过程一样,都是嵌入到MySQL服务器的一段程序

触发器是由事件来触发某个操作,这些事件包括INSERT,UNDATE,DELETE事件,所谓事件就是指用户的动作或者触发某项行为,如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就回自动触发触发器执行相应的操作.

当对数据表中的数据执行插入,更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现.

2.触发器的创建

创建触发器的语法结构是:

sql 复制代码
CREATE TRIGGER 触发器名称
{BEFORE | AFTER} {INSERT | UPDATE |DELETE} ON 表名
FOR EACH ROW
触发器执行的语句块;

说明:

表名:表示触发器监控的对象

BEFORE | AFTER:表示触发的时间,BEFORE表示在事件之前触发,AFTER表示在事件之后触发

INSERT | UPDATE | DELETE表示触发的事件,INSERT表示插入记录时触发,UPDATE表示更新记录时触发,DELETE表示删除记录时触发

触发器执行的代码块:可以是单条SQL语句,也可以是由BEGIN...END结构组成的复合语句块

代码举例

sql 复制代码
DELIMITER //

CREATE TRIGGER before_insert
BEFORE INSERT ON test_trigger
FOR EACH ROW
BEGIN
    INSERT INTO test_trigger_log(log_info, create_time)
    VALUES ('before_insert', NOW());
END //

DELIMITER ;

3.查看,删除触发器

3.1查看触发器

查看触发器是查看数据库中已经存在的触发器的定义,状态和语法信息等

方式1:查看当前数据库的所有触发器的定义

sql 复制代码
SHOW TRIGGERS;

方式2:查看当前数据库中某个触发器的定义

sql 复制代码
SHOW CREATE TRIGGER 触发器名;

方式3:从系统库information_schema的TRIGGERS表中查询"salary_check_trigger"触发器的信息

sql 复制代码
SELECT * FROM information_schema.`TRIGGERS`;

3.2删除触发器

触发器也是数据库对象,删除触发器也用DROP语句,语法格式如下

sql 复制代码
DROP TRIGGER IF EXISTS 触发器名称;

4.触发器的优缺点

4.1优点

1.触发器可以确保数据的完整性

2.触发器可以帮助我们记录操作日志

利用触发器,可以具体记录什么时间发生了什么。比如,记录修改会员储值金额的触发器,就是一个很好的例子。这对我们还原操作执行时的具体场景,更好地定位问题原因很有帮助。

3.触发器还可以用在操作数据前,对数据进行合法性检查

比如,超市进货的时候,需要库管录入进货价格。但是,人为操作很容易犯错误,比如说在录入数量的时候,把条形码扫进去了;录入金额的时候,看串了行,录入的价格远超售价,导致账上的巨亏...... 这些都可以通过触发器,在实际插入或者更新操作之前,对相应的数据进行检查,及时提示错误,防止错误数据进入系统。

4.2缺点

1.触发器最大的一个问题就是可读性差

因为触发器存储在数据库中,并且由事件驱动,这就意味着触发器有可能不受应用层的控制。这对系统维护是非常有挑战的。

2.相关数据的变更,可能会导致触发器出错

特别是数据表结构的变更,都可能会导致触发器出错,进而影响数据操作的正常运行。这些都会由于触发器本身的隐蔽性,影响到应用中错误原因排查的效率

4.3注意点

注意:如果在子表中定义了外键约束,并且外键指定了 ON UPDATE/DELETE CASCADE/SET NULL 子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的 UPDATE 和 DELETE 语句定义的触发器并不会被激活。

例如:基于子表员工表(t_employee)的 DELETE 语句定义了触发器 t1,而子表的部门编号(did)字段定义了外键约束引用了父表部门表(t_department)的主键列部门编号(did),并且该外键加了 "ON DELETE SET NULL" 子句,那么如果此时删除父表部门表(t_department)在子表员工表(t_employee)有匹配记录的部门记录时,会引起子表员工表(t_employee)匹配记录的部门编号(did)修改为 NULL,但是此时不会激活触发器 t1。只有直接对子表员工表(t_employee)执行 DELETE 语句时才会激活触发器 t1。

相关推荐
AIgorithmGEEK5 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
Lost_the_wind5 小时前
MySQL学习笔记四
mysql
唠点键盘之外的7 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
云和恩墨7 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环
数据库
ly76897 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界
数据库·mongodb·事务·分片集群·快照隔离·写冲突
豆角焖肉8 小时前
Spring AOP 自定义注解实现系统操作日志
数据库·自定义注解·springaop·操作日志·aop 切面
金伟API10249 小时前
不会写复杂SQL怎么办?
数据库·sql
执笔为剑9 小时前
2.1.2-1、V8R3迁移到V8R6-Oracle兼容特性
数据库
geovindu9 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__10 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧