2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法

欢迎各位彦祖与热巴畅游本人专栏与博客

你的三连是我最大的动力

以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现]

专栏跑道一

➡️网络空间安全——全栈前沿技术持续深入学习

image.gif

专栏跑道二

➡️ 24 Network Security -LJS

image.gif

image.gif

image.gif

专栏跑道三


➡️ MYSQL REDIS Advance operation

image.gif

专栏跑道四

➡️HCIP;H3C-SE;CCIP——LJS[华为、华三、思科高级网络]

image.gif

专栏跑道五

➡️RHCE-LJS[Linux高端骚操作实战篇]

image.png

专栏跑道六

➡️数据结构与算法[考研+实际工作应用+C程序设计]

image.gif

专栏跑道七

➡️RHCSA-LJS[Linux初级及进阶骚技能]

image.gif

image.gif

上节回顾





1.MySQL触发器的使用场景

1.1. 数据完整性约束

插入触发器

-- 创建一个名为 `person` 的表
CREATE TABLE `person` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,  -- 定义 id 列为整型,非空,自增
  `name` VARCHAR(100) NOT NULL,           -- 定义 name 列为可变字符型,最大长度100,非空
  `age` INT(11) NOT NULL,                 -- 定义 age 列为整型,非空
  PRIMARY KEY (`id`)                       -- 设置 id 列为主键
);
-- 更改分隔符,以便定义触发器
DELIMITER //
-- 创建一个名为 `trigger_insert_mytable` 的触发器
CREATE TRIGGER `trigger_insert_mytable` 
BEFORE INSERT ON `person`                  -- 在 `person` 表插入数据之前触发
FOR EACH ROW                                -- 对每一行插入的数据执行触发器逻辑
BEGIN
  -- 触发器逻辑部分,可以在此处编写需要执行的代码
  
  -- 示例:将插入的数据的 name 字段转换为大写
  SET NEW.name = UPPER(NEW.name);          -- 使用 UPPER 函数将新插入的 name 字段转换为全大写
END //                                      -- 结束触发器逻辑
DELIMITER ;                                 -- 恢复默认分隔符
image.gif

效果图

image.gif 编辑

image.gif 编辑

更新触发器[效果图略]:

-- 创建一个名为 trigger_name 的触发器
CREATE TRIGGER trigger_name
BEFORE UPDATE ON table_name               -- 在 table_name 表进行更新操作之前触发
FOR EACH ROW                               -- 对于每一行被更新的记录都会执行触发器逻辑
BEGIN
    -- 触发器逻辑部分
    -- 这里可以添加你需要执行的操作,例如验证数据、记录日志等
END;
image.gif

删除触发器[效果图略]:

-- 创建一个名为 trigger_name 的触发器
CREATE TRIGGER trigger_name
BEFORE DELETE ON table_name               -- 在 table_name 表进行删除操作之前触发
FOR EACH ROW                               -- 对于每一行被删除的记录都会执行触发器逻辑
BEGIN
    -- 触发器逻辑部分
    -- 可以在这里添加代码,比如记录日志、检查条件等
END;
image.gif

2. 数据变更日志的记录与追踪

2.1如何具体创建person的日志表

-- 创建一个名为 person_log 的表,用于记录人员变更日志
CREATE TABLE person_log (
  id INT(11) NOT NULL AUTO_INCREMENT,  -- 日志记录的唯一标识,自动递增
  event_type VARCHAR(50) NOT NULL,      -- 事件类型,例如 INSERT、UPDATE 等
  event_time DATETIME NOT NULL,         -- 事件发生的时间
  person_id INT(11) NOT NULL,           -- 相关人员的 ID
  person_name VARCHAR(100) NOT NULL,    -- 相关人员的姓名
  person_age INT(11) NOT NULL,          -- 相关人员的年龄
  PRIMARY KEY (id)                       -- 将 id 列设置为主键
);
-- 创建一个触发器,当在 person 表中插入新记录后执行
CREATE TRIGGER trigger_insert_person
AFTER INSERT ON person                    -- 在 person 表插入操作后触发
FOR EACH ROW                              -- 每插入一行都会执行触发器
BEGIN
    -- 记录变更日志,将插入事件的信息写入 person_log 表
    INSERT INTO person_log (event_type, event_time, person_id, person_name, person_age)
    VALUES ('INSERT', NOW(), NEW.id, NEW.name, NEW.age);  -- 使用 NEW 关键字获取新插入行的数据
END;
image.gif

效果图:

image.gif 编辑

3. 触发器与存储过程的对比与选择

触发器与存储过程的对比与选择详解说明表

触发器
  • 自动触发:
  • 触发器是与数据操作紧密关联的,当满足触发条件时自动执行,无需手动调用
  • 数据驱动:
  • 触发器通过对数据库中的特定表进行监视,对数据操作作出响应,可以在插入、更新或删除数据时执行相应的操作
  • 适用范围:
  • 适用于需要在数据操作发生时自动执行的简单逻辑,如验证、约束、日志记录等。触发器通常较轻量级,用于处理特定表上的少量逻辑
存储过程
  • 手动调用:
  • 存储过程是一段可由应用程序手动调用的代码块,需要显式调用才能执行
  • 逻辑复杂性:
  • 存储过程适用于较为复杂的业务逻辑,可以包含条件判断、循环、事务控制等复杂逻辑结构
  • 参数和返回值:
  • 存储过程可以接受参数和返回结果,使其更加灵活和可配置,适合处理多样化的业务需求
  • 应用层控制:
  • 存储过程通常由应用程序来调用和管理,可以作为一个整体被多个应用程序共享和复用
选择
  • 触发器
  • 适合在数据库层面上处理与数据操作紧密相关的简单逻辑。对于无需手动干预、并且随着数据操作自动执行的逻辑,触发器是一个好的选择
  • 存储过程
  • 适合处理较为复杂的业务逻辑,需要手动控制执行时机,并且可能需要参数传递和结果返回的情况

4.触发器的性能和注意事项

触发器的性能和注意事项详解说明表

性能影响
  • 触发器会在每次受影响的行上执行操作。如果触发器逻辑复杂或在大量数据插入时使用触发器,可能会对性能产生负面影响。

  • 因此,在编写触发器时,应尽量保持逻辑简洁,并评估其对性能的影响
死锁风险
  • 触发器可能引发死锁问题,特别是在涉及多个表之间的触发器操作时。

  • 确保在触发器中避免无限循环或引发额外的锁定操作,以防止死锁发生
触发器顺序
  • 如果数据库中存在多个触发器,触发器的执行顺序可能会影响结果。

  • 要确保触发器的执行顺序符合预期,可以使用CREATE TRIGGER语句的BEFOREAFTER关键字进行调整
触发器的影响范围
  • 触发器是与表相关联的,且在表上的特定操作(例如插入、更新和删除)时触发。

  • 请确保了解触发器的触发条件和适用范围,以免意外触发或未触发触发器
权限
  • 创建和管理触发器需要适当的权限。

  • 确保对数据库和表具有足够的权限来创建和执行触发器
调试和测试
  • 在编写和使用触发器之前,进行充分的调试和测试是非常重要的。

  • 确保触发器的逻辑正确,并验证其与其他操作的交互是否符合预期

 


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10月前
|
监控 关系型数据库 MySQL
|
存储 SQL NoSQL
2024Mysql And Redis基础与进阶操作系列(10)作者——LJS[你个IKUN还学不会嘛?你是真爱粉嘛?真是的 ~;以后别侮辱我家鸽鸽]
Mysql And Redis基础与进阶操作系列之存储函数和MySQL 触发器等具体举例以及详解步骤;注意点及常见报错问题所对应的解决方法]
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MYSQL日志之详解如何配置查看二进制、查询及慢查询日志;备份与恢复等具体详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
|
存储 SQL NoSQL
|
NoSQL 关系型数据库 MySQL
2024 RedisAnd Mysql基础与进阶操作系列(19)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
Redis应用场景之取最新N个数据的操作、精准设定过期时间、计数器应用、Uniq操作,获取某段时间所有数据排重值、Pub/Sub构建实时消息系统等保姆式具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
105 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多