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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 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关键字进行调整
触发器的影响范围
  • 触发器是与表相关联的,且在表上的特定操作(例如插入、更新和删除)时触发。

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

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

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

 


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MYSQL日志之详解如何配置查看二进制、查询及慢查询日志;备份与恢复等具体详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
|
1月前
|
存储 SQL NoSQL
|
1月前
|
NoSQL 关系型数据库 MySQL
2024 RedisAnd Mysql基础与进阶操作系列(19)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
Redis应用场景之取最新N个数据的操作、精准设定过期时间、计数器应用、Uniq操作,获取某段时间所有数据排重值、Pub/Sub构建实时消息系统等保姆式具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 SQL NoSQL
2024Mysql And Redis基础与进阶操作系列(10)作者——LJS[你个IKUN还学不会嘛?你是真爱粉嘛?真是的 ~;以后别侮辱我家鸽鸽]
Mysql And Redis基础与进阶操作系列之存储函数和MySQL 触发器等具体举例以及详解步骤;注意点及常见报错问题所对应的解决方法]
|
1月前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(8)作者——LJS[含MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;注意点及常见报错问题所对应的解决方法]
MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;举例说明注意点及常见报错问题所对应的解决方法
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
19 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
23 3
|
5天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
29 2
|
18天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
130 15
|
12天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。

相关产品

  • 云数据库 RDS MySQL 版