📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 CSDN博客专家 | CSDN后端领域优质创作者 | CSDN内容合伙人 | 2022博客之星
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战
🔥计算机底层原理🔥深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文导读
本文讲解触发器基本概念与原理,包括什么是触发器、触发器与存储过程异同、触发器的特性、优缺点和实际应用。第二节讲解MySQL触发器实战,包括创建、查看、MySQL修改和删除触发器,最后讲解MySQL支持的触发器类型触发器类型NEW和OLD的使用。
一、触发器基本概念与原理
1、什么是触发器
触发器是一种特殊的存储过程(主要用于保护表中的数据),当SQL试图更改受触发器保护的数据时,触发器会自动执行。特别是,当存在多个彼此相关的表时,触发器可以使不同的表保持数据一致性。
在MySQL中,触发器只能在执行 INSERT、DELETE 和 UPDATE 操作时激活。其他SQL语句不会激活触发器。
2、触发器与存储过程异同
MySQL触发器与存储过程(触发器是特殊的存储过程)一样,是完成特定功能并存储在数据库服务器上的SQL片段,它们都是在MySQL中管理数据的工具。
不同之处在于,存储过程的执行需要使用CALL语句来调用SQL段,而触发器的执行不需要使用CALL语句来CALL,也不需要手动启动。相反,当对数据库表中的数据执行DML操作时,SQL段的执行将自动触发,而无需手动调用。例如当学生表被操作(INSERT、DELETE或UPDATE)时,它将被激活以执行。
别名OLD和NEW用于引用触发器中已更改的记录内容,触发器只支持行级触发,不支持语句级触发。
3、触发器的特性
1、触发条件? INSERT、UPDATE和DELETE
2、何时触发? 添加、删除或修改之前或之后
3、触发频率? 每行执行一次
4、触发器都是定义并将其附加到表上
4、触发器的优缺点
优点:
触发器可以自动执行。它们在触发器相关表中的数据被相应修改后立即执行。
触发器可以实现比 FOREIGN KEY 约束、CHECK 约束更复杂的检查和操作。
触发器可以实现表数据的级联更改,并保证数据的完整性。
缺点:
当SQL出现问题时,使用触发器实现的业务逻辑很难定位,特别是当涉及多个触发器。
大量使用触发器导致代码结构被破坏。
如果要更改的数据量很大,则触发器的执行效率非常低。
5、触发器的实际应用
触发器的这一特性有助于确保数据库端的数据完整性、日志记录、数据验证等操作。
例如,在开发项目时,数据表更改时,都需要自动处理(统计总数),此时可以使用触发器来处理 。
二、MySQL触发器实战
1、创建MySQL触发器
MySQL使用 CREATE TRIGGER 语句创建触发器,BEFORE和AFTER,表示触发触发器的时间是在激活它的语句之前或之后触发的。
如果要验证新数据是否满足条件,使用 BEFORE 选项;如果要在激活触发器的语句执行后完成几个或多个更改,通常使用 AFTER 选项。
CREATE TRIGGER 触发器名 before|after
触发事件(<INSERT | UPDATE | DELETE >)
ON <表名> FOR EACH Row 执行语句(<触发器主体>);
-- 例如:当***表执行了insert 之后,触发器则会自动在user_log添加日志记录
create trigger trigger_name after
insert
on user for each row
insert into user_logs values(NULL,now(),'new');
2、查看MySQL触发器
查看触发器是指查看数据库中已经存在的触发器的定义、状态和语法信息。MySQL中查看触发器的方法包括 SHOW TRIGGERS 语句和查询 information_schema 数据库的查询 triggers 数据表。
-- SHOW TRIGGERS语句查看触发器信息
SHOW TRIGGERS;
-- 在triggers表中查看触发器信息
-- 所有触发器的信息都存在 information_schema 数据库的 triggers 表中
SELECT * FROM information_schema.triggers WHERE trigger_name= '触发器名';
3、修改和删除MySQL触发器
使用 DROP 语句将触发器从数据库中删除,DROP TRIGGER 语句需要 SUPER 权限,要修改触发器,必须删除原始触发器并创建一个同名的新触发器。
-- 使用 DROP 语句将触发器从数据库中删除
-- DROP TRIGGER 语句需要 SUPER 权限
-- IF EXISTS:避免在没有触发器的情况下删除触发器
DROP TRIGGER [ IF EXISTS ] [数据库名] <要删除的触发器名称>
-- 删除上一节中创建的触发器
DROP TRIGGER trigger_name;
三、MySQL支持的触发器类型
1、触发器类型NEW和OLD的使用
MySQL定义了NEW和OLD,用于表示触发器所在表中触发了触发器的哪一行数据,并引用触发器中更改的记录内容
INSERT 类型触发器:NEW表示要添加或已添加的数据
UPDATE 类型触发器:OLD表示修改前的数据,NEW表示要修改或已经修改的数据
DELETE 类型触发器:OLD表示要删除或已删除的数据
2、INSERT 触发器
在INSERT语句执行之前或之后响应的触发器。
使用INSERT触发器时应注意,在INSERT触发器代码中,可以引用名为NEW(不区分大小写)的虚拟表来访问插入的行。
在 BEFORE INSERT 触发器中,也可以更新NEW中的值,即允许更改插入的值。
在AUTO_INCREMENT 列中,NEW在执行INSERT之前包含 0值,在执行INSERT之后将包含一个新的自动生成的值。
3、UPDATE 触发器
在执行UPDATE语句之前或之后响应的触发器。
使用UPDATE触发器时应注意,在UPDATE触发器代码中,可以引用名为NEW(不区分大小写)的虚拟表来访问更新的值。
在UPDATE触发器代码中,可以在执行UPDATE语句之前引用名为OLD(不区分大小写)的虚拟表来访问值,OLD中的所有值都是只读的,无法更新。
在BEFORE UPDATE触发器中,也可以更新NEW中的值,也就是说,允许更改UPDATE语句中使用的值(只要您具有相应的操作权限)。
UPDATE触发器,只能使用BEFORE类型的触发器,不允许使用AFTER类型的触发器。
4、DELETE 触发器
在执行DELETE语句之前或之后响应的触发器。
使用DELETE触发器时应注意,在DELETE触发器代码中,可以引用名为OLD(不区分大小写)的虚拟表来访问删除的行,同样与UPDATE触发器一样,OLD中的所有值都是只读的,无法更新。
总结
本文讲解触发器基本概念与原理,包括什么是触发器、触发器与存储过程异同、触发器的特性、优缺点和实际应用。第二节讲解MySQL触发器实战,包括创建、查看、MySQL修改和删除触发器,最后讲解MySQL支持的触发器类型触发器类型NEW和OLD的使用。
版权归原作者 小明java问道之路 所有, 如有侵权,请联系我们删除。