MySQL触发器详解保证入土

news2024/10/11 14:23:58

文章目录

  • 简介
  • 一、MySQL触发器基础
  • 触发器分类
  • 基础常用关键字
      • 1. 定义触发器
      • 2. 创建和删除触发器
      • 3. 执行时机和条件
  • 二、MySQL触发器的使用场景
    • 1. 数据完整性约束
      • 插入触发器
      • 更新触发器
      • 删除触发器
    • 2. 数据变更日志的记录与追踪
    • 3. 触发器与存储过程的对比与选择
  • 三、触发器的性能和注意事项
  • 四、总结

简介

数据库触发器是一种在特定数据操作(如插入、更新或删除)发生时自动执行的动作。本文将介绍MySQL触发器的基础知识和使用方法。

一、MySQL触发器基础

触发器分类

MySQL触发器可以按照执行时机和数据操作类型进行分类。下面是MySQL触发器的分类:

  1. 按执行时机分类:

    • BEFORE触发器:在数据操作之前执行触发器逻辑。
    • AFTER触发器:在数据操作之后执行触发器逻辑。
  2. 按数据操作类型分类:

    • INSERT触发器:在插入数据之前或之后执行触发器逻辑。
    • UPDATE触发器:在更新数据之前或之后执行触发器逻辑。
    • DELETE触发器:在删除数据之前或之后执行触发器逻辑。

触发器的分类有助于根据具体需求选择合适的触发器类型。例如,BEFORE INSERT触发器可以用于在插入数据之前验证数据完整性,AFTER UPDATE触发器可以用于记录数据变更日志等。

基础常用关键字

以下是一些MySQL触发器关键字的示例用法:
在MySQL中,触发器常用的关键字包括:

  1. BEFORE:表示在数据操作之前执行触发器逻辑。
  2. AFTER:表示在数据操作之后执行触发器逻辑。
  3. FOR EACH ROW:表示针对每一行数据执行触发器逻辑。
  4. BEGIN和END:用于定义触发器的逻辑代码块。
  5. NEW:代表要插入、更新或删除的新数据引用。可以通过NEW来访问新值。
  6. OLD:代表要更新或删除的旧数据引用。只能在UPDATE和DELETE触发器中使用。
  7. SET:用于设置变量的值,可用于对NEW或OLD的字段进行赋值操作。
  8. IF和THEN:用于条件判断,控制触发器逻辑的执行流程。
  9. INSERT、UPDATE、DELETE:分别表示插入、更新和删除操作的关键字,可用于在相应类型的触发器中执行相应的逻辑。

这些关键字可以根据具体需求在触发器逻辑中使用,用于控制数据操作的时机、访问指定的数据和执行相应的操作。

  1. BEFORE:

    CREATE TRIGGER `trigger_before_insert` BEFORE INSERT ON `mytable`
    FOR EACH ROW
    BEGIN
      -- 在插入数据之前执行的逻辑
    END;
    
  2. AFTER:

    CREATE TRIGGER `trigger_after_update` AFTER UPDATE ON `mytable`
    FOR EACH ROW
    BEGIN
      -- 在更新数据之后执行的逻辑
    END;
    
  3. FOR EACH ROW:

    CREATE TRIGGER `trigger_for_each_row` AFTER DELETE ON `mytable`
    FOR EACH ROW
    BEGIN
      -- 针对每一行删除操作执行的逻辑
    END;
    
  4. BEGIN和END:

    CREATE TRIGGER `trigger_multiple_statements` AFTER INSERT ON `mytable`
    FOR EACH ROW
    BEGIN
      DECLARE var INT;
      SET var = NEW.age + 10;
      IF (var > 50) THEN
        -- 逻辑语句1
      ELSE
        -- 逻辑语句2
      END IF;
    END;
    
  5. NEW:

    CREATE TRIGGER `trigger_new_value` BEFORE INSERT ON `mytable`
    FOR EACH ROW
    BEGIN
      SET NEW.name = UPPER(NEW.name);
    END;
    
  6. OLD:

    CREATE TRIGGER `trigger_old_value` BEFORE UPDATE ON `mytable`
    FOR EACH ROW
    BEGIN
      IF (OLD.age < NEW.age) THEN
        -- 逻辑语句
      END IF;
    END;
    
  7. SET:

    CREATE TRIGGER `trigger_set_value` AFTER INSERT ON `mytable`
    FOR EACH ROW
    BEGIN
      SET @total = @total + NEW.quantity;
    END;
    
  8. IF和THEN:

    CREATE TRIGGER `trigger_if_then` BEFORE DELETE ON `mytable`
    FOR EACH ROW
    BEGIN
      IF (OLD.age > 30) THEN
        -- 逻辑语句1
      ELSE
        -- 逻辑语句2
      END IF;
    END;
    

这些示例演示了触发器关键字的一些常用用法。你可以根据自己的需求进行调整和扩展以满足特定的业务逻辑。

1. 定义触发器

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
BEGIN
    -- 触发器逻辑
END;

其中关键部分包括:

  • trigger_name:触发器的名称,你可以根据需要自定义。

  • {BEFORE | AFTER}:指定触发器在数据操作之前(BEFORE)或之后(AFTER)执行。

  • {INSERT | UPDATE | DELETE}:指定触发器在哪种类型的数据操作时触发,可以是插入数据(INSERT)、更新数据(UPDATE)或删除数据(DELETE)。

  • table_name:指定触发器所属的表名。

  • FOR EACH ROW:确保触发器逻辑应用于每一行受影响的数据。

  • BEGINEND:定义了触发器逻辑的开始和结束位置,你可以在其中编写相应的代码来实现需要的业务逻辑。

这个语法模板可以帮助你创建符合需求的触发器,并根据实际情况编写适当的触发器逻辑。

2. 创建和删除触发器

  • 创建触发器:
CREATE TRIGGER trigger_name ...
  • 删除触发器:
DROP TRIGGER IF EXISTS trigger_name;

3. 执行时机和条件

  • BEFORE触发器:在数据操作之前执行。
  • AFTER触发器:在数据操作之后执行。
  • FOR EACH ROW:对每一行数据执行触发器逻辑。

二、MySQL触发器的使用场景

1. 数据完整性约束

插入触发器

-- 创建插入触发器
CREATE TABLE `person` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(100) NOT NULL,
  `age` INT(11) NOT NULL,
  PRIMARY KEY (`id`)
);
DELIMITER //
CREATE TRIGGER `trigger_insert_mytable` BEFORE INSERT ON `person`
FOR EACH ROW
BEGIN
  -- 触发器逻辑,可以在此处编写需要执行的代码
  
  -- 示例:将插入的数据的name字段转换为大写
  SET NEW.name = UPPER(NEW.name);
END //
DELIMITER ;

在这里插入图片描述

更新触发器

CREATE TRIGGER trigger_name
BEFORE UPDATE ON table_name
FOR EACH ROW
BEGIN
    -- 触发器逻辑
END;

删除触发器

CREATE TRIGGER trigger_name
BEFORE DELETE ON table_name
FOR EACH ROW
BEGIN
    -- 触发器逻辑
END;

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

-- 创建person的日志表
CREATE TABLE person_log (
  id INT(11) NOT NULL AUTO_INCREMENT,
  event_type VARCHAR(50) NOT NULL,
  event_time DATETIME NOT NULL,
  person_id INT(11) NOT NULL,
  person_name VARCHAR(100) NOT NULL,
  person_age INT(11) NOT NULL,
  PRIMARY KEY (id)
);
-- 创建person的触发器
CREATE TRIGGER trigger_insert_person
AFTER INSERT ON person
FOR EACH ROW
BEGIN
    -- 记录变更日志
    INSERT INTO person_log (event_type, event_time, person_id, person_name, person_age)
    VALUES ('INSERT', NOW(), NEW.id, NEW.name, NEW.age);
END;

在这里插入图片描述

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

触发器和存储过程是在数据库中实现复杂业务逻辑的两种不同方式。下面是它们的对比和选择方面的考虑:

触发器:

  • 自动触发:触发器是与数据操作紧密关联的,当满足触发条件时自动执行,无需手动调用。
  • 数据驱动:触发器通过对数据库中的特定表进行监视,对数据操作作出响应,可以在插入、更新或删除数据时执行相应的操作。
  • 适用范围:适用于需要在数据操作发生时自动执行的简单逻辑,如验证、约束、日志记录等。触发器通常较轻量级,用于处理特定表上的少量逻辑。

存储过程:

  • 手动调用:存储过程是一段可由应用程序手动调用的代码块,需要显式调用才能执行。
  • 逻辑复杂性:存储过程适用于较为复杂的业务逻辑,可以包含条件判断、循环、事务控制等复杂逻辑结构。
  • 参数和返回值:存储过程可以接受参数和返回结果,使其更加灵活和可配置,适合处理多样化的业务需求。
  • 应用层控制:存储过程通常由应用程序来调用和管理,可以作为一个整体被多个应用程序共享和复用。

选择:

  • 触发器适合在数据库层面上处理与数据操作紧密相关的简单逻辑。对于无需手动干预、并且随着数据操作自动执行的逻辑,触发器是一个好的选择。
  • 存储过程适合处理较为复杂的业务逻辑,需要手动控制执行时机,并且可能需要参数传递和结果返回的情况。

三、触发器的性能和注意事项

在使用触发器时,有几个注意点需要考虑:

  1. 性能影响:触发器会在每次受影响的行上执行操作。如果触发器逻辑复杂或在大量数据插入时使用触发器,可能会对性能产生负面影响。因此,在编写触发器时,应尽量保持逻辑简洁,并评估其对性能的影响。

  2. 死锁风险:触发器可能引发死锁问题,特别是在涉及多个表之间的触发器操作时。确保在触发器中避免无限循环或引发额外的锁定操作,以防止死锁发生。

  3. 触发器顺序:如果数据库中存在多个触发器,触发器的执行顺序可能会影响结果。要确保触发器的执行顺序符合预期,可以使用CREATE TRIGGER语句的BEFOREAFTER关键字进行调整。

  4. 触发器的影响范围:触发器是与表相关联的,且在表上的特定操作(例如插入、更新和删除)时触发。请确保了解触发器的触发条件和适用范围,以免意外触发或未触发触发器。

  5. 权限:创建和管理触发器需要适当的权限。确保对数据库和表具有足够的权限来创建和执行触发器。

  6. 调试和测试:在编写和使用触发器之前,进行充分的调试和测试是非常重要的。确保触发器的逻辑正确,并验证其与其他操作的交互是否符合预期。

四、总结

MySQL触发器是数据库中重要且有用的功能。通过本文的学习,你应该掌握了MySQL触发器的基础知识和使用方法,并了解了触发器对数据库性能的影响以及使用触发器的技巧和注意事项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/993282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强大的JTAG边界扫描(5):FPGA边界扫描应用

文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 上一篇文章&#xff0c;介绍了基于STM32F103的JTAG边界扫描应用&#xff0c;演示了TopJTAG Probe软件的应用&#xff0c;以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用&#xff0c;两者几乎…

巨人互动|Facebook海外户Facebook风控规则有什么

Facebook是全球最大的社交媒体平台之一&#xff0c;每天有数十亿的用户在其上发布、分享和交流各种内容。为了维护平台的安全性和用户体验&#xff0c;Facebook制定了严格的风控规则来监测和处理违规行为。下面小编讲讲Facebook风控规则。 巨人互动|Google海外户&Google Ad…

CocosCreator3.8研究笔记(十一)CocosCreator Prefab(预制件)理解

相信很多朋友都不知道 Prefab 是什么&#xff1f;为什么要使用Prefab &#xff1f; 怎么使用Prefab&#xff1f; 接下来&#xff0c;我们就一步一步来揭晓答案。 一、Prefab 是什么 &#xff1f; Prefab&#xff1a;大家习惯性地称为“预制件” 或“预制体” &#xff0c;简单说…

Java事件机制简介 内含面试题

面试题分享 云数据解决事务回滚问题 点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮…

昇腾Ascend TIK自定义算子开发教程(概念版)

一、参考资料 【2023 CANN训练营第一季】Ascend C算子开发入门&#xff08;中&#xff09; 二、重要说明 TIK2编程范式把算子核内的处理程序&#xff0c;分成多个流水任务&#xff0c;任务之间通过队列&#xff08;Queue&#xff09;进行通信和同步&#xff0c;并通过统一的…

MySQL——备份和还原

备份 热备 即MySQL服务在运行的时候进行的备份 mysqldump命令 mysqldump --databases db1 db2 db3 > dump.sql mysqldump -uroot -pSanchuang1234# --all-databases >all_db.sql mysqldump -uroot -pSanchuang123# --databases TENNIS >/backup/tennis.sql mysq…

分享一个python基于数据可视化的智慧社区服务平台源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1…

【rust/egui】(九)使用painter绘制一些图形—基本使用

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 painter 定义pub struct Painter {///…

领域驱动设计:DDD分层架构

文章目录 DDD 分层架构DDD 分层架构最重要的原则DDD 分层架构推动架构演进三层架构如何演进到 DDD 分层架构 微服务架构模型有好多种&#xff0c;例如整洁架构、CQRS 和六边形架构等等。每种架构模式虽然提出的时代和背景不同&#xff0c;但其核心理念都是为了设计出“高内聚低…

gpt测试

已知a地一石头售价80&#xff0c;b地售价112&#xff0c;小明初始资金8000&#xff0c;在a地全仓购入后&#xff0c;去b地出售&#xff0c;然后小明又回到a地&#xff0c;再次全仓购入然后去b地出售&#xff0c;这样继续出售10次后&#xff0c;小明有多少钱&#xff1f;石头是不…

Java中wait和notify详解

线程的调度是无序的&#xff0c;随机的&#xff0c;但是也是有一定的需求场景&#xff0c;希望能够有序执行&#xff0c;join算是一种控制顺序的方式&#xff08;功能有限&#xff09;——》一个线程执行完&#xff0c;才能执行另一个线程&#xff01; 本文主要讲解的&#xf…

C++---类和对象

这里写目录标题 封装简介语法二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录 封装 简介语法 类 &#xff1a;抽象的 共性的 对象&#xff1a;实例化的 具体的 个性的 封装 就是把属性和行为放在一起 加一些访问权…

CCRC-PIPA个人信息保护评估师

个人信息保护评估师 (Personal InformationProtec-tion Assessor&#xff0c;简称 “PIPA”) 是由中国网络安全审查技术与认证中心(简称CCRC) 推出的面向个人信息保护领域的培训认证。CCRC-PIPA课程以《个人信息保护法》、法规、部门规章、相关国家标准和行业最佳实践为基础&am…

代理IP在海外SEO优化中有哪些关键作用?

代理IP在海外SEO优化业务中的应用越来越受到企业的重视。它为企业提供了大量不同地区的IP地址&#xff0c;帮助企业模拟不同地区、不同设备的用户行为&#xff0c;有助于更准确地了解当地的搜索引擎规则和优化策略&#xff0c;更好地评估网站的排名和流量。 一、代理IP的优势 …

【Stable Diffusion XL】huggingface diffusers 官方教程解读

文章目录 01 TutorialDeconstruct a basic pipelineDeconstruct the Stable Diffusion pipelineAutopipelineTrain a diffusion model 相关链接&#xff1a; GitHub&#xff1a; https://github.com/huggingface/diffusers 官方教程&#xff1a;https://huggingface.co/docs/di…

第2章_瑞萨MCU零基础入门系列教程之面向过程与面向对象

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

thinkphp6 入门(6)--中间件是什么 怎么用

一、什么是中间件&#xff1f; 当客户端发送请求至服务器时&#xff0c;HTTP请求会经过多个中间件&#xff0c;最后返回响应给客户端。中间件可以 在请求到达目标控制器或动作之前对请求进行操作 可以在响应离开目标控制器或动作之前对响应进行操作 二、中间件的作用 我们可…

【Python】conda虚拟环境下使用pyinstaller打包程序为exe

文章目录 一、为什么要用conda虚拟环境二、pyinstaller用法2.1 安装 PyInstaller2.2 基本用法打包一个 Python 脚本2.21 打包一个 Python 项目2.22 打包选项 2.3 打包依赖项2.31 导出依赖项列表2.32 配置依赖项 2.4 自定义打包选项2.5 打包完成后的文件2.6 注意事项 三、打包示…

RabbitMQ 知识点解读

1、AMQP 协议 1.1、AMQP 生产者的流转过程 当客户端与Broker 建立连接的时候&#xff0c;会调用factory .newConnection 方法&#xff0c;这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker &#xff0c;以此通知Broker 本次交互采用的是AMQPO-9-1 协议&…

文件上传漏洞案例

目录 1.案例一 1&#xff09;案例源码 2&#xff09;创建web.php文件 3&#xff09;使用抓包软件 2.案例二 1&#xff09;案例代码 2&#xff09; 案例分析 3&#xff09;copy命令生成图片马 4&#xff09;上传图片马到服务器 5&#xff09;解析 文件图片 3.案例三 …