详解MySQL触发器使用方法

触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行

触发器:trigger,是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增、删、改)的时候,系统会自动触发代码并执行。

触发器可以在执行语句前或执行后触发其他 SQL 代码运行。触发器可以读取触发语句改变了哪些数据,但是没有返回值。因此可以使用触发器加强业务逻辑的约束而不需要在应用程序写对应的代码。

从上述描述可以看到,触发器可以简化应用程序的逻辑并且可以提升性能,这是因为使用触发器减少了应用程序和服务端的交互次数。同时,触发器有助于完成自动更新归一化和统计数据。例如,我们可以使用触发器自动统计交易订单总金额,订单数及平均客单价。 然而,MySQL 的触发器的应用场合也十分有限,如果你使用过其他数据库产品的触发器,不要以为 MySQL 也能实现相同的功能,例如:

  • 每个数据表的单一事件只能有一个触发器,也就是说对于 AFTER INSERT 这样的事件来说,不能同时有超过1个的触发器。
  • MySQL 只支持行级别的触发器,也就是只能按 FOR EACH ROW 这种方式使用触发而不是整个 SQL 语句,这对于大量数据的操作而言会比较低效。MySQL 的触发器只能按下面的形式编写:
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
   执行语句列表;
END

执行语句列表支持单条或多条语句,下面是一个多条语句的示例:

DELIMITER $$
CREATE TRIGGER user_create_log AFTER INSERT ON t_users FOR EACH ROW
BEGIN
DECLARE log_info VARCHAR(40)character set utf8;
DECLARE description VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
SET description = " is created";
SET log_info = CONCAT(NEW.user_name, description);     #函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(log_info);
END $$

DELIMITER ;
  • 触发器可能导致服务端实际执行的工作不可预测,一个简单的语句可能导致服务端做大量不可见的工作。例如,如果一个触发器更新了 一个相关的表,可能导致受影响的行数加倍。
  • 触发器难以调试,并且一旦引入了触发器,很难分析性能瓶颈。
  • 触发器会导致潜在的锁等待和死锁。如果触发器失败了,源查询也会失败。如果没有意识到触发器的存在,这类玩呢提很难发现。

大多数限制中,最大的限制是 FOR EACH ROW 的设计,这有时候导致触发器没法用于维护统计和缓存表,这是因为这可能很慢。使用触发器的主要理由是相比定时同步更新,触发器可以一致保持数据的一致性。 触发器也没法保证原子性。例如,更新 MyISAM 数据表的触发器在源 SQL 语句出错后,无法回滚。而且,触发器自身也可能都只错误。如果我们使用了 AFTER UPDATE 基于 MyISAM 数据表去更新另一个表。如果触发器有个导致第二张表操作失败的错误,那对于第一张表的操作不会回滚。

InnoDB 的触发器相关的操作,包括源语句都在同一个事务中,因此是满足原子性的。然而,如果使用InnoDB 的触发器去与另一张表校验数据一致性的时候,这个时候如果不小心的话可能导致不正确的结果。例如,假设需要使用触发器模拟外键,可以使用 BEFORE INSERT触发器验证另一张表是否存在对应的记录,但是如果在触发器读取另一张表数据的时候不使用 SELECT FOR UPDATE的话,则由于并发性性问题可能导致错误的结果。 虽然触发器有些缺陷,但是这并不意味着不能用。相反,触发器本身也是有用的,尤其是对于约束,系统维护任务和保持统计数据保持最新。

也可以使用触发器记录数据行的变化。这样即便是离线手动操作数据库的记录(如修复错误数据)也能够被记录下来。但是,需要注意的是对于往其他自增主键表插入数据时要小心,这对于复制性的语句表现会有问题,因为自增值对于两个相同的副本值并不同。

触发器在有限的场合能够发挥其优势,比如统计数据、数据表变更日志等。但是也会有一些缺陷,比如大数据量的更新由于逐行触发,会降低效率。还有就是,MyISAM 引擎无法保障原子性。因此,要根据应用场景是否要是有触发器。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/219774.html<

(0)
运维的头像运维
上一篇2025-04-14 06:37
下一篇 2025-04-14 06:38

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注