MySQL触发器详解保证入土

文章目录

  • 简介
  • 一、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
    BEGINDECLARE var INT;SET var = NEW.age + 10;IF (var > 50) THEN-- 逻辑语句1ELSE-- 逻辑语句2END IF;
    END;
    
  5. NEW:

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

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

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

    CREATE TRIGGER `trigger_if_then` BEFORE DELETE ON `mytable`
    FOR EACH ROW
    BEGINIF (OLD.age > 30) THEN-- 逻辑语句1ELSE-- 逻辑语句2END 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.mzph.cn/news/75293.shtml

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

相关文章

C++学习笔记(重载、类)

C 1、函数重载2、类2.1、类的方法和属性2.2、类的方法的定义2.3、构造器和析构器2.4、基类与子类2.5、类的public、protected、private继承2.6、类的方法的重载2.7、子类方法的覆盖2.8、继承中的构造函数和析构函数 1、函数重载 函数重载大概可以理解为&#xff0c;定义两个名…

C语言实现三字棋

实现以下&#xff1a; 1游戏不退出&#xff0c;继续玩下一把&#xff08;循环&#xff09; 2应用多文件的形式完成 test.c. --测试游戏 game.c -游戏函数的实现 game.h -游戏函数的声明 (2)游戏再走的过程中要进行数据的存储&#xff0c;可以使用3*3的二维数组 char bor…

idea VCS配置多个远程仓库

Idea VCS配置多个远程仓库 首先要有两个或多个不同远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔&#xff1a; 应用开源架构进行项目开发&#xff0…

Java版企业电子招标采购系统源码—企业战略布局下的采购寻源

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

Qt串口基本设置与协议收发

前言 1.一直都想要做一个Qt上位机&#xff0c;趁着这个周末有时间&#xff0c;动手写一下 2.comboBox没有点击的信号&#xff0c;所以做了一个触发的功能 3.Qt的数据类型很奇怪&#xff0c;转来转去的我也搞得很迷糊 4.给自己挖个坑&#xff0c;下一期做一个查看波形的上位…

Android 9.0 网络之netd详解

一、DHCP流程 分析netd之前先了解一下网络自动获取IP流程&#xff0c;借鉴下图流程查看代码&#xff1a; &#xff08;1&#xff09;WIFI扫描到可用网络后进行连接&#xff0c;代码路径&#xff1a;\frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiStateMa…

OJ练习第167题——单词接龙

单词接龙 力扣链接&#xff1a;127. 单词接龙 题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&…

Vue2+Vue3笔记(尚硅谷张天禹老师)day03

声明:只是记录&#xff0c;初心是为了让页面更好看,会有错误,我并不是一个会记录的人&#xff0c;所以有点杂乱无章的感觉&#xff0c;我先花点时间把视频迅速过掉&#xff0c;再来整理这些杂乱无章的内容 计划是一天更新一点 待做的东西 完成博客记录把完成后的博客记录拆成单…

计算机网络的故事——简单的HTTP协议

简单的HTTP协议 文章目录 简单的HTTP协议一、简单的HTTP协议 一、简单的HTTP协议 HTTP是不保存状态的协议&#xff0c;为了实现保存状态功能于是引入了Cookie技术。 method: get:获取资源 post:传输实体主体 put:传输文件 head:获取报文首部&#xff0c;用于确认URI的有效性以…

把文件上传到Gitee的详细步骤

目录 第一步&#xff1a;创建一个空仓库 第二步&#xff1a;找到你想上传的文件所在的地址&#xff0c;打开命令窗口&#xff0c;git init 第三步&#xff1a;git add 想上传的文件 &#xff0c;git commit -m "给这次提交取个名字" 第四步&#xff1a;和咱们在第…

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]”它的作用是&#xff0c;帮你绕…

C++ 多态语法点

前置知识点 成员变量和成员函数分开存储&#xff0c;只有非静态成员变量才属于类的对象上。 静态成员变量和静态成员函数没有在类上存储。 非静态成员函数也不属于类的对象上 class Animal {public:virtual void speak(){cout<<"动物在说话"<<endl;}}v…

注解-宋红康

目录 一、注解&#xff08;Annotation&#xff09;概述二、常见的注解实例三、如何自定义注解四、JDK中的四个元注解五、Java8注解的新特性1、可重复注解2、类型注解 一、注解&#xff08;Annotation&#xff09;概述 二、常见的注解实例 三、如何自定义注解 自定义注解必须配…

虚拟化和容器

文章目录 1 介绍1.1 简介1.2 虚拟化工作原理1.3 两大核心组件&#xff1a;QEMU、KVMQEMUKVM 1.4 发展历史1.5 虚拟化类型1.6 云计算与虚拟化1.7 HypervisorHypervisor分为两大类 1.8 虚拟化 VS 容器 2 虚拟化应用dockerdocker 与虚拟机的区别 K8Swine 参考 1 介绍 1.1 简介 虚…

springBoot对接Apache POI 实现excel下载和上传

搭建springboot项目 此处可以参考 搭建最简单的SpringBoot项目_Steven-Russell的博客-CSDN博客 配置Apache POI 依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version> </…

FastChat工作原理解析

在了解FastChat如何完成大模型部署前&#xff0c;先了解下Huggingface提供的Transformer库。Hugggingface提供的Transformer库 Hugging Face 的 Transformers 库是一个用于自然语言处理&#xff08;NLP&#xff09;任务的 Python 库&#xff0c;旨在简化和加速使用预训练语言模…

手写Spring:第5章-注入属性和依赖对象

文章目录 一、目标&#xff1a;注入属性和依赖对象二、设计&#xff1a;注入属性和依赖对象三、实现&#xff1a;注入属性和依赖对象3.0 引入依赖3.1 工程结构3.2 注入属性和依赖对象类图3.3 定义属性值和属性集合3.3.1 定义属性值3.3.2 定义属性集合 3.4 Bean定义补全3.5 Bean…

android 注解详解

1&#xff0c;注解的概念 注解现在广泛的应用于android的各个开源框架中&#xff0c;不理解注解&#xff0c;我们就无法更好的提升我们的架构能力。那么什么是注解呢&#xff1f;注解&#xff08;Annotation&#xff09;&#xff0c;是JDK5.0 引入的一种注释机制。 注解是元数…

go的iris框架进行本地资源映射到服务端

我这里使用的是HandleDirapi,有其他的请补充 package mainimport ("github.com/kataras/iris/v12" )type Hello struct{Status int json:"status"Message string json:"message" }func main(){app : iris.New()//第一个api:相当于首页app.Get(&q…

飞猪店铺小管家软件需求分析说明书

飞猪店铺小管家软件 项目背景&#xff1a; 在飞猪店铺运营过程中&#xff0c;客服人数不足导致客服团队忙不过来&#xff0c;容易出现订票信息错误&#xff0c;进而客户无法顺利参观景点&#xff0c;频繁投诉。这种情况不仅影响客户体验&#xff0c;还可能导致商家因赔付而承受…