我在广州学Mysql 系列——触发器的使用

ℹ️大家好,我是练小杰,这周是春节前的最后一周了,现在一双手数都能数得过来了!!
本播客将学习MYSQL中触发器的相关概念以及基础命令~~
回顾:👉【MYSQL视图相关例题】
数据库专栏👉【数据库专栏】~
想要了解更多内容,主页 【练小杰的CSDN】

在这里插入图片描述

文章目录

  • 触发器
    • 触发器的类型
    • 触发的条件
    • 触发器的优缺点
  • 创建触发器
    • 创建只有一个执行语句的触发器
    • 创建有多个执行语句的触发器
      • 一个触发器示例说明
  • 查看触发器
    • SHOW TRIGGERS语句查看触发器信息
    • `triggers`表中查看触发器信息
  • 删除触发器
  • 综合案例——触发器使用
    • 步骤1:创建persons表
    • 步骤2:创建一个销售额表sales
    • 步骤3:创建一个触发器
    • 步骤4:向persons表中插入记录
    • 步骤5:查看表persons和 sales
    • 步骤6:查看触发器

在这里插入图片描述

触发器

  • 定义:触发器是一种与关联的数据库事件处理程序,当发生特定事件(如插入、更新、删除等)时,触发器会自动执行相关的SQL语句。
  • 同时,触发器的执行不是由程序调用或手工启动,而是由事件来触发的。
  • 在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。

触发器的类型

  • MySQL支持以下几种类型的触发器:

BEFORE触发器: 在指定操作(如INSERT、UPDATE、DELETE)发生之前执行。
AFTER触发器: 在指定操作发生之后执行。

触发的条件

  • 针对每种操作类型,触发器可以针对以下表的操作定义:
  • INSERT:当向表中插入新行时触发。
  • UPDATE:当更新表中的行时触发。
  • DELETE:当从表中删除行时触发。

触发器的优缺点

  • 优点:

自动化:触发器可以自动执行某些操作,减少手动操作的错误和工作量。
数据完整性:触发器可以加强数据的完整性约束,确保数据的合法性。

  • 缺点:

性能影响:触发器会在表操作时立即执行,复杂的业务逻辑会增加操作延迟。
调试困难:触发器的调试相对复杂,建议在开发阶段充分测试。
逻辑复杂:避免在触发器中编写过于复杂的逻辑,以免影响数据库的稳定性。

创建触发器

  • 基本语法如下:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
trigger_body;
  • 命令说明:

trigger_name:触发器的名称。
BEFORE | AFTER:指定触发时机。
INSERT | UPDATE | DELETE :指定触发事件。
table_name:触发器作用的表名。
FOR EACH ROW:表示触发器针对表中的每一行数据执行。
trigger_body :定义触发器的业务逻辑,可以包含多个SQL语句

创建只有一个执行语句的触发器

  • 创建一个触发器,语法如下:
CREATE TRIGGER trigger_name trigger_time  trigger_eventON tbl_name FOR EACH ROW trigger_stmt

创建有多个执行语句的触发器

  • 当需要在触发器中执行多个操作时,可以使用BEGIN...END块来包含这些语句。

一个触发器示例说明

假设我们有一个employees表和一个audit_log表。我们希望在向employees表中插入、更新或删除数据时,自动在audit_log表中记录相应的操作日志。

  • 定义表的结构
    创建employees和audit_log表:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),position VARCHAR(100),salary DECIMAL(10, 2),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);CREATE TABLE audit_log (log_id INT AUTO_INCREMENT PRIMARY KEY,employee_id INT,action VARCHAR(10),action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,details VARCHAR(255)
);
  • 触发器1:插入操作后记录日志

向employees表中插入新员工时,记录日志。

DELIMITER $$CREATE TRIGGER after_insert_employees
AFTER INSERT ON employees
FOR EACH ROW
BEGIN-- 插入审计日志INSERT INTO audit_log (employee_id, action, details)VALUES (NEW.id, 'INSERT', CONCAT('Added new employee: ', NEW.name));-- 这里还可以添加更多操作,例如发送通知等
END$$DELIMITER ;
  • 触发器2:更新操作后记录日志

每次更新employees表中的员工信息时,都记录日志。

DELIMITER $$CREATE TRIGGER after_update_employees
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN-- 检查是否有字段被修改IF NEW.name <> OLD.name OR NEW.position <> OLD.position OR NEW.salary <> OLD.salary THEN-- 插入审计日志INSERT INTO audit_log (employee_id, action, details)VALUES (NEW.id, 'UPDATE', CONCAT('Updated employee: ', NEW.name, ', Position: ', NEW.position, ', Salary: ', NEW.salary));END IF;END$$DELIMITER ;
  • 触发器3:删除操作后记录日志

从employees表中删除员工时,记录到日志里。

DELIMITER $$CREATE TRIGGER after_delete_employees
AFTER DELETE ON employees
FOR EACH ROW
BEGIN-- 插入审计日志INSERT INTO audit_log (employee_id, action, details)VALUES (OLD.id, 'DELETE', CONCAT('Deleted employee: ', OLD.name));END$$DELIMITER ;

查看触发器

SHOW TRIGGERS语句查看触发器信息

  • 使用命令SHOW TRIGGERS查看触发器
SHOW TRIGGERS;

triggers表中查看触发器信息

  • 在MySQL中,所有触发器的定义都存在INFORMATION_SCHEMA数据库的TRIGGERS表格中,可以通过查询命令SELECT来查看。
  • 查询INFORMATION_SCHEMA表:
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_database_name';
  • 查询数据库sys的触发器信息
 SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = 'sys';
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+----------------------+--------------------+
| TRIGGER_CATALOG | TRIGGER_SCHEMA | TRIGGER_NAME               | EVENT_MANIPULATION | EVENT_OBJECT_CATALOG | EVENT_OBJECT_SCHEMA | EVENT_OBJECT_TABLE | ACTION_ORDER | ACTION_CONDITION | ACTION_STATEMENT                                                                                                                  | ACTION_ORIENTATION | ACTION_TIMING | ACTION_REFERENCE_OLD_TABLE | ACTION_REFERENCE_NEW_TABLE | ACTION_REFERENCE_OLD_ROW | ACTION_REFERENCE_NEW_ROW | CREATED                | SQL_MODE                                                                                                              | DEFINER             | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION |
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+----------------------+--------------------+
| def             | sys            | sys_config_insert_set_user | INSERT             | def                  | sys                 | sys_config         |            1 |             NULL | BEGINIF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THENSET NEW.set_by = USER();END IF;
END | ROW                | BEFORE        |                       NULL |                       NULL | OLD                      | NEW                      | 2024-12-25 19:56:15.08 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | mysql.sys@localhost | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
| def             | sys            | sys_config_update_set_user | UPDATE             | def                  | sys                 | sys_config         |            1 |             NULL | BEGINIF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THENSET NEW.set_by = USER();END IF;
END | ROW                | BEFORE        |                       NULL |                       NULL | OLD                      | NEW                      | 2024-12-25 19:56:15.09 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | mysql.sys@localhost | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)

删除触发器

  • 使用DROP TRIGGER语句可以删除MySQL中已经定义的触发器。
DROP TRIGGER IF EXISTS trigger_name;

综合案例——触发器使用

以下是一个简单的触发器案例,可以帮助我们快速学习触发器的基础命令!!!

步骤1:创建persons表

CREATE TABLE persons (name VARCHAR(40), num int);
Query OK, 0 rows affected (0.04 sec)

步骤2:创建一个销售额表sales

CREATE TABLE sales (name VARCHAR(40), sum int);
Query OK, 0 rows affected (0.04 sec)

步骤3:创建一个触发器

CREATE TRIGGER num_sum AFTER INSERT ON  persons FOR EACH ROW INSERT  INTO  sales VALUES (NEW.name,7*NEW.num);
Query OK, 0 rows affected (0.01 sec)

可以看到,这里创建的触发器是当在数据表persons中插入数据后,把列 num 的数值乘以7之后,最后插入到表sales中的列sum

步骤4:向persons表中插入记录

INSERT INTO persons VALUES ('xiaojie',20),('eason',49);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

步骤5:查看表persons和 sales

  • 查询表persons数据
SELECT * FROM persons;
+---------+------+
| name    | num  |
+---------+------+
| xiaojie |   20 |
| eason   |   49 |
+---------+------+
2 rows in set (0.00 sec)
  • 查询表sales数据
SELECT *FROM sales;
+---------+------+
| name    | sum  |
+---------+------+
| xiaojie |  140 |
| eason   |  343 |
+---------+------+
2 rows in set (0.00 sec)

步骤6:查看触发器

SHOW TRIGGERS;
+---------+--------+---------+-------------------------------------------------+--------+------------------------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger | Event  | Table   | Statement                                       | Timing | Created                | sql_mode                                   | Definer        | character_set_client | collation_connection | Database Collation |
+---------+--------+---------+-------------------------------------------------+--------+------------------------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| num_sum | INSERT | persons | INSERT  INTO  sales VALUES (NEW.name,7*NEW.num) | AFTER  | 2025-01-20 15:26:23.78 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+---------+--------+---------+-------------------------------------------------+--------+------------------------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)

本文有关mysql数据库触发器的使用先讲到这里,明天再见!!
主页:【练小杰的CSDN】😆
ℹ️欢迎各位在评论区踊跃讨论,积极提出问题,解决困惑!!!
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!

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

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

相关文章

大数据,Hadoop,HDFS的简单介绍

大数据 海量数据&#xff0c;具有高增长率、数据类型多样化、一定时间内无法使用常规软件工具进行捕捉、管理和处理的数据集 合 大数据的特征: 4V Volume : 巨大的数据量 Variety : 数据类型多样化 结构化的数据 : 即具有固定格式和有限长度的数据 半结构化的数据 : 是…

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a; 1.指出一些自学的误区 2.提供…

微服务与docker

准备工作 在课前资料中给大家提供了黑马商城项目的资料,我们需要先导入这个单体项目。不过需要注意的是,本篇及后续的微服务学习都是基于Centos7系统下的Docker部署,因此你必须做好一些准备: Centos7的环境及一个好用的SSH客户端装好Docker会使用Docker如果是学习过上面Doc…

(7)(7.2) 围栏

文章目录 前言 1 通用设置 2 围栏类型 3 破坏栅栏行动 4 使用 RC 通道辅助开关启用栅栏 5 自动高度规避 6 在任务规划器中启用围栏 7 用于遥控飞行训练 8 MAVLink 支持 前言 ArduPilot 支持基于本机的圆柱形&#xff08;“TinCan”&#xff09;和多边形和/或圆柱形、…

uniapp——App 监听下载文件状态,打开文件(三)

5 实现下载文件并打开 这里演示&#xff0c;导出Excel 表格 文章目录 5 实现下载文件并打开DEMO监听下载进度效果图为什么 totalSize 一直为0&#xff1f; 相关Api&#xff1a; downloader DEMO 提示&#xff1a; 请求方式支持&#xff1a;GET、POST&#xff1b;POST 方式需要…

mybatis的多对一、一对多的用法

目录 1、使用VO聚合对象&#xff08;可以解决这两种情况&#xff09; 多对一&#xff1a; 一对多&#xff1a; 2、非聚合的多对一做法&#xff1a; 3、非聚合的一对多做法&#xff1a; 1、使用VO聚合对象&#xff08;可以解决这两种情况&#xff09; 当我需要多对一、一对…

Vscode:问题解决办法 及 Tips 总结

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个功能强大的开源代码编辑器&#xff0c;广泛用于各种编程语言和开发场景&#xff0c;本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法&#xff0c;使用过程中的技巧 文章目录 扩展安装失败调试配…

MySQL 窗口函数

MySQL 窗口函数 1&#xff0c;窗口函数 1.1&#xff0c;什么是窗口函数1.2&#xff0c;基本语法 2&#xff0c;函数详解 2.1&#xff0c;聚合函数2.2&#xff0c;排序函数2.3&#xff0c;偏移函数2.4&#xff0c;值函数 3&#xff0c;进阶用法 1&#xff0c;窗口函数 1.1&am…

基于vite+vue3+mapbox-gl从零搭建一个项目

下面是基于 Vite、Vue 3 和 Mapbox GL 从零搭建一个项目的完整步骤&#xff0c;包括环境搭建、依赖安装、配置和代码示例。 文章目录 1. 初始化项目2. 安装 mapbox-gl 依赖3. 配置 Mapbox Access Token4. 实现地图组件5. 在 App.vue 中使用地图组件6. 启动开发服务器7. 添加自定…

Data Filtering Network 论文阅读和理解

目录 一、TL&#xff1b;DR 二、Introduction 2.1 apple的结论 2.2 业界做法&#xff1a; 2.3 我们的做法&#xff08;Apple&#xff09; 2.4 如何获取好的DFN 三、未完待续&#xff08;这周出去购物了&#xff0c;下周继续补充&#xff09; 一、TL&#xff1b;DR 核心…

ingress-nginx代理tcp使其能外部访问mysql

一、helm部署mysql主从复制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解压后编辑values.yaml文件&#xff0c;修改如下&#xff08;storageclass已设置默认类&#xff09; 117 ## param architecture MySQL archit…

浅谈安科瑞电能质量监测和治理产品在分布式光伏电站的应用-安科瑞 蒋静

1 概述 随着对可再生能源需求的增加&#xff0c;分布式光伏电站的建设和发展迅速。然而&#xff0c;分布式光伏电站的运行过程中面临着一系列问题&#xff0c;比如导致企业关口计量点功率因数过低、谐波污染等。这些问题不仅影响光伏电站自身的运行效率&#xff0c;还会对企业…

CSS实现实现票据效果 mask与切图方式

一、“切图”的局限性 传统的“切图”简单暴力,但往往缺少适应性。 适应性一般有两种,一是尺寸自适应,二是颜色可以自定义。 举个例子,有这样一个优惠券样式 关于这类样式实现技巧,之前在这篇文章中有详细介绍: CSS 实现优惠券的技巧 不过这里略微不一样的地方是,两个…

ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档

一、云电脑&#xff1a;电竞新宠崛起 在电竞游戏不断发展的今天&#xff0c;硬件性能成为了决定游戏体验的关键因素。为了追求极致的游戏画面与流畅度&#xff0c;玩家们往往需要投入大量资金购置高性能电脑。然而&#xff0c;云电脑技术的出现&#xff0c;为玩家们提供了一种…

Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放

Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放 1 添加依赖2 测试代码3 测试结果 在OpenCV中&#xff0c;仿射变换&#xff08;Affine Transformation&#xff09;和透视变换&#xff08;Perspective Transformation&#xff09;是两种常用的图像几何变换方法。 变换方…

回归预测 | MATLAB基于TCN-BiGRU时间卷积神经网络结合双向门控循环单元多输入单输出回归预测

效果一览 基本介绍 回归预测 | MATLAB基于TCN-BiGRU时间卷积神经网络结合双向门控循环单元多输入单输出回归预测 一、引言 1.1、研究背景及意义 在当今数据驱动的时代&#xff0c;时间序列预测已成为金融、气象、工业控制等多个领域的关键技术。随着人工智能和机器学习技术的…

TMC2208替代A4988

前言 TMC2208 是一款先进的 1 轴步进驱动器&#xff0c;支持 stealthChop ™和 256 微步。本应用说明介绍了如何设置 TMC2208 以替代 A4988&#xff08;传统模式&#xff09;。 引脚比较 与其他电机驱动器相比&#xff0c;TMC2208 具有附加功能&#xff1a;256 微步。 自动…

多层 RNN原理以及实现

数学原理 多层 RNN 的核心思想是堆叠多个 RNN 层&#xff0c;每一层的输出作为下一层的输入&#xff0c;从而逐层提取更高层次的抽象特征。 1. 单层 RNN 的数学表示 首先&#xff0c;单层 RNN 的计算过程如下。对于一个时间步 t t t&#xff0c;单层 RNN 的隐藏状态 h t h_t…

数据结构——AVL树的实现

Hello&#xff0c;大家好&#xff0c;这一篇博客我们来讲解一下数据结构中的AVL树这一部分的内容&#xff0c;AVL树属于是数据结构的一部分&#xff0c;顾名思义&#xff0c;AVL树是一棵特殊的搜索二叉树&#xff0c;我们接下来要讲的这篇博客是建立在了解搜索二叉树这个知识点…

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…