4.4 MySQL 触发器(Trigger)

news2024/11/25 0:25:23

触发器是一种特殊的数据库对象,在特定事件(如INSERTUPDATEDELETE)触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。


1. 简介

1.1 什么是触发器

触发器(Trigger)是由用户定义的一组 SQL 语句,在数据库表上进行某些特定操作时自动触发执行。

1.2 触发器的作用

  • 数据一致性:在数据修改前后执行验证,确保数据的完整性和一致性。
  • 自动化处理:简化业务逻辑,例如记录日志、更新关联表。
  • 强制约束:在数据库层面实现复杂规则,避免业务逻辑遗漏。

1.3 触发器的特性

  • 每个触发器绑定到一个表。
  • 支持触发的事件:INSERTUPDATEDELETE
  • 支持触发时机:BEFORE(操作之前触发)和 AFTER(操作之后触发)。
  • 不支持触发器内直接调用事务控制语句(如COMMITROLLBACK)。

2. 语法

2.1 创建触发器

CREATE TRIGGER 触发器名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON 表名
FOR EACH ROW
触发器逻辑;
  • 触发时机
    • BEFORE:在事件发生之前执行。
    • AFTER:在事件发生之后执行。
  • 触发事件
    • INSERT:插入新数据时触发。
    • UPDATE:更新数据时触发。
    • DELETE:删除数据时触发。
  • 触发器逻辑BEGINEND 包含的多条 SQL 语句。

2.2 删除触发器

DROP TRIGGER [IF EXISTS] 触发器名;

2.3 查看触发器

SHOW TRIGGERS;

3. 使用场景

3.1 日志记录

在表发生数据变更时,将操作记录到日志表中。

3.2 自动计算

根据插入或更新的值自动更新其他表或字段。

3.3 数据验证

在插入或更新数据前检查合法性。

3.4 联动更新

修改某表数据时,自动同步更新关联表数据。


4. 案例

4.1 日志记录案例

需求

employees 表中插入新员工时,将操作记录到 employee_logs 表中。

表结构
CREATE TABLE employees (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    position VARCHAR(50),
    salary DECIMAL(10, 2)
);

CREATE TABLE employee_logs (
    log_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_id INT,
    log_time DATETIME,
    action VARCHAR(50)
);
创建触发器
DELIMITER $$

CREATE TRIGGER trg_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employee_logs (emp_id, log_time, action)
    VALUES (NEW.emp_id, NOW(), 'INSERT');
END$$

DELIMITER ;
  • NEW关键字:表示新插入的行数据。
  • 触发逻辑:在插入 employees 表后,将信息记录到日志表中。
测试触发器
INSERT INTO employees (name, position, salary)
VALUES ('Alice', 'Manager', 8000.00);

SELECT * FROM employee_logs;

4.2 数据验证案例

需求

禁止在 employees 表中插入薪资低于 3000 的员工。

创建触发器
DELIMITER $$

CREATE TRIGGER trg_employee_salary_check
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
    IF NEW.salary < 3000 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Salary must be at least 3000';
    END IF;
END$$

DELIMITER ;
  • SIGNAL语句:用于抛出自定义错误。
  • 触发逻辑:在插入之前检查薪资是否符合要求。
测试触发器
INSERT INTO employees (name, position, salary)
VALUES ('Bob', 'Developer', 2000); -- 触发错误

4.3 联动更新案例

需求

当更新 employees 表的员工薪资时,将变更记录到 employee_logs 表中。

创建触发器
DELIMITER $$

CREATE TRIGGER trg_employee_update
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employee_logs (emp_id, log_time, action)
    VALUES (OLD.emp_id, NOW(), CONCAT('UPDATE: ', OLD.salary, ' -> ', NEW.salary));
END$$

DELIMITER ;
  • OLD关键字:表示更新前的行数据。
  • 触发逻辑:记录薪资变更的详细信息。
测试触发器
UPDATE employees
SET salary = 9000
WHERE emp_id = 1;

SELECT * FROM employee_logs;

5. 注意事项

  • 触发器的数量限制:每个表每种事件最多只能有一个 BEFORE 和一个 AFTER 触发器。
  • 性能影响:触发器的执行会增加额外的系统开销,建议在必要时使用。
  • 错误处理:在触发器中使用 SIGNAL 语句处理业务逻辑错误。
  • 事务支持:触发器的执行与其事件处于同一事务中,事务回滚会撤销触发器的操作。

以上内容涵盖了 MySQL 触发器的概述、语法、使用场景及实践案例,帮助您更高效地利用触发器实现数据库操作自动化。

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

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

相关文章

案例研究|阿特斯的JumpServer分布式部署和多组织管理实践

苏州阿特斯阳光电力科技有限公司&#xff08;以下简称为阿特斯&#xff09;是一家集太阳能光伏组件制造和为全球客户提供太阳能应用产品研发、设计、制造、销售的专业公司。 阿特斯集团总部位于加拿大&#xff0c;中国区总部位于江苏省苏州市。通过全球战略和多元化的市场布局…

tongweb安全整改

一 禁止以root账号运行tongweb服务 1 如果是首次安装须创建普通用户安装tongweb 2 如果已经使用root账号安装了tongweb 2.1 创建普通用户 2.2 使用root账号授予tongweb安装目录宿主权限为普通用户 2.3赋权成功后&#xff0c;后续启动tongweb服务必须为普通用户 二 tongRDS隐…

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型&#xff1a;检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…

tcpdump抓包 wireShark

TCPdump抓包工具介绍 TCPdump&#xff0c;全称dump the traffic on anetwork&#xff0c;是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能: 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 2、支持网络层…

HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…

YOLOV5 /onnx模型转换成rknn

上两篇文章讲述了pytorch模型下best.pt转换成onnx模型&#xff0c;以及将onnx进行简化成为best-sim.onnx, 接下来这篇文章讲述如何将onnx模型转换成rknn模型&#xff0c;转换成该模型是为了在rk3568上运行 1.创建share文件夹 文件夹包含以下文件best-sim.onnx,rknn-tookit2-…

【51单片机】LCD1602液晶显示屏

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是…

如何使用AWS Lambda构建一个云端工具(超详细)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;如何使用AWS Lambda构建一个云端工具&#xff08;超详细&#xff09; 1 前言 1.1 无服务器架构 无服务器架构&#xff08;Serverless Computing&#xff09;是一种云计算服务模型&#xff0c;它允许开发者构建和运行…

【Isaac Sim】相关问题汇总

目录 一、安装点击Install时报错二、启动时报 Failed to create any GPU devices三、加载Isaac Sim自带模型或示例时报 Isaac Sim is not responding 一、安装点击Install时报错 报错&#xff1a; request to https://asset.launcher.omniverse.nvidia.com/… failed, reason:…

Spring-02-springmvc

2. 什么是SpringMVC 2.1. 概述 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java实现MVC的轻量级Web框架。 为什么要学习SpringMVC呢? Spring MVC的特点&#xff1a; 轻量级&#xff0c;简单易学高效 , 基于请求响应的MVC框架与Spring兼容性好&#xff0c;无缝…

深度学习之目标检测的技巧汇总

1 Data Augmentation 介绍一篇发表在Big Data上的数据增强相关的文献综述。 Introduction 数据增强与过拟合 验证是否过拟合的方法&#xff1a;画出loss曲线&#xff0c;如果训练集loss持续减小但是验证集loss增大&#xff0c;就说明是过拟合了。 数据增强目的 通过数据增强…

qt添加模块

以QtNetwork模块为例 方式一 扩展-qt vs tools-qt project settings 方式二 右键选中项目-属性-qt project settings 方法三 在此界面选择select modules,即可进行相应模块添加

【信息系统项目管理师】第2章:信息技术发展 考点梳理

文章目录 2.1 信息技术及其发展2.1.1 计算机软硬件2.1.2 计算机网络2.1.3 存储和数据库2.1.4 信息安全2.1.5 信息技术的发展 2.2 新一代信息技术及应用2.2.1 物联网2.2.2 云计算2.2.3 大数据2.2.4 区块链2.2.5 人工智能2.2.6 虚拟现实 2.1 信息技术及其发展 2.1.1 计算机软硬件…

【线程】Java多线程编程

【线程】Java多线程编程 一、前言一个最简单的多线程编程示例可以使用的工具 二、创建线程的方式三、Thread类中重要的属性和方法3.1 构造方法3.2 常见属性 一、前言 当有多个线程的时候&#xff0c;这些线程的执行顺序是不确定的。这一点&#xff0c;是我们之前提到的操作系统…

unsloth vlm模型Qwen2-VL、Llama 3.2 Vision微调案例

T4卡15G显卡训练 参考: https://github.com/unslothai/unsloth 按自己显卡cuda版本安装 免费colab微调代码: Qwen2-VL: https://colab.research.google.com/drive/1whHb54GNZMrNxIsi2wm2EY_-Pvo2QyKh?usp=sharing from unsloth import FastVisionModel # NEW instead …

window11编译pycdc.exe

一、代码库和参考链接 在对python打包的exe文件进行反编译时&#xff0c;会使用到uncompyle6工具&#xff0c;但是这个工具只支持python3.8及以下&#xff0c;针对更高的版本的python则不能反编译。 关于反编译参考几个文章&#xff1a; Python3.9及以上Pyinstaller 反编译教…

oracle如何配置第二个监听优化数据传输

oracle如何配置第二个监听优化数据传输 服务器两个网卡&#xff0c;配置两个不同IP和端口的监听。 归档日志量每天很大&#xff0c;为了不影响业务&#xff0c;需要配置一个单独的万兆网络来专门的传输归档日志到DG库&#xff0c;这里就涉及到在19c中增加一个监听用来使用专门…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…

用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 引言1. 分类交叉熵损失导数&#xff08;Categorical Cross-Entropy loss derivative&#xff09;2. 分类交叉熵损失导数 - 代码实现3. Softmax激活函数导数&#xff08;Softmax activation derivative&#xff09;4. Softmax激…

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种非常重要的传输层协议。它们各有特点&#xff0c;适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…