触发器对象

news2024/9/25 8:29:18

触发器是什么?

触发器(Triggers)是数据库中的一种特殊对象,它们会在某些数据库事件发生时自动执行。触发器的主要作用是对表的操作(如INSERTUPDATEDELETE)做出响应,并执行特定的操作。

触发器的操作

CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE ON table_name FOR EACH ROW
BEGIN
    -- 触发器执行的 SQL 语句
END;

触发器的组成部分:

  1. trigger_name:这是触发器的名称,用户可以根据需要自定义,以便标识和管理触发器。

  2. BEFORE/AFTER:指定触发器的触发时间。BEFORE意味着在数据操作之前执行,AFTER意味着在数据操作完成之后执行。

    • BEFORE:可以用于在插入、更新或删除之前进行数据验证或转换。
    • AFTER:适合在数据操作后进行日志记录或数据同步等操作。
  3. INSERT/UPDATE/DELETE:这是触发器监视的操作类型。可以指定触发器在数据插入、更新或删除时触发执行。

    • INSERT:当表中有新记录插入时触发。
    • UPDATE:当表中的记录被更新时触发。
    • DELETE:当表中的记录被删除时触发。
  4. table_name:表示触发器所监视的表的名称,意味着该触发器将监听此表的指定操作。

  5. FOR EACH ROW:表示触发器会对表中受影响的每一行执行一次。如果操作影响了多行记录,那么触发器会逐行执行。

  6. SQL 语句:触发器定义的核心逻辑部分,在触发事件发生时自动执行。可以是简单的 SQL 操作,也可以是复杂的逻辑操作。

触发器的应用场景:

  • 数据验证:在数据插入或更新前,使用触发器验证数据的合法性。
  • 自动计算字段:可以通过触发器在插入数据时自动计算或设置一些字段的值。
  • 日志记录:当对表执行某些操作时,触发器可以自动记录日志。
  • 数据同步:在主表的数据发生变化时,触发器可以自动更新或同步到其他表中。

注意事项:

  • 触发器的频繁使用可能导致数据库的性能下降,尤其是在表的操作非常频繁的情况下。
  • 复杂的触发器可能会导致维护难度增加,因此需要谨慎设计。

NEW 和 OLD 的含义:

  1. NEW

    • 当执行 INSERTUPDATE 操作时,NEW 用于指代新插入或更新后的数据
    • INSERT 触发器中,NEW 引用的是即将被插入的行数据。
    • UPDATE 触发器中,NEW 引用的是更新后的行数据。
  2. OLD

    • 当执行 UPDATEDELETE 操作时,OLD 用于指代旧数据(即触发器前的数据)。
    • UPDATE 触发器中,OLD 引用的是更新之前的行数据。
    • DELETE 触发器中,OLD 引用的是即将被删除的行数据。

举例说明:

假设有一个表 my_table,其中包含一个名为 quantity 的列。在这个表的 UPDATE 操作上创建一个触发器,用来将旧的 quantity加到新的 quantity中。代码如下:

CREATE TRIGGER my_trigger
BEFORE UPDATE ON my_table
FOR EACH ROW
BEGIN
    SET NEW.quantity = NEW.quantity + OLD.quantity;
END;

解释:

  • OLD.quantity 引用的是更新之前该行的 quantity 值。
  • NEW.quantity 引用的是更新之后即将被保存到表中的 quantity 值。
  • 在触发器中,新的 quantity 值会变成旧值和新值的总和。

注意事项:

  • NEWOLD 只能在适用于它们的操作中使用。例如,INSERT 触发器中无法使用 OLD,因为插入时不存在旧数据,反之,DELETE 触发器中无法使用 NEW
  • 使用 BEFOREAFTER 时要注意,如果修改了 NEW 的值,应该在 BEFORE 触发器中进行,因为 AFTER 触发器已经是操作后的阶段。

示例:

drop table if exists dept2;
create table dept2(
    id int primary key comment  'ID',
    name varchar(50) not null comment '部门名称'
) comment '部门';
INSERT INTo dept2(id, name) VALUES(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部');

drop table if exists oper_log;
create table oper_log(
    id bigint primary key auto_increment,
    table_name varchar(100) not null comment '操作的哪张表',
    oper_type varchar(100) not null comment '操作类型包括insert delete update',
    oper_time datetime not null comment '操作时间',
    oper_id bigint not null comment '操作的那行记录的id',
    oper_desc text comment '操作描述'
);

/*
    触发器:需求:当向dept表当中insert插入数据之后(after),在oper_log表中记录日志
*/
 drop trigger if exists trigger_dept_insert;

create trigger trigger_dept_insert
/*  触发规则  */
after insert  on dept2 for each row
begin
    /* 一旦触发后发生的操作 */
    insert into oper_log(id, table_name, oper_type, oper_time, oper_id, oper_desc)
    values (null,'dept', 'insert', now(), new.id, concat('插入数据: id =', new.id , ', name = ', new.name));
end;
INSERT INTO dept2 (id, name) VALUES (5, '总经办');

# SHOW CREATE TABLE dept;

/*
 触发器
需求:更新dept表之后,在oper_log中记录日志
 */

drop trigger if exists trigger_dept_update;

create trigger trigger_dept_update  after update on dept2 for each row
begin
    /* 一旦触发后发生的操作 */
    insert into oper_log(id, table_name, oper_type, oper_time, oper_id, oper_desc)
    values (null,'dept', 'update', now(), new.id, concat('更新后: id = ', new.id , ', name = ', new.name,'  更新前: id = ',old.id, ' ,name = ', OLD.name));
end;


/*
 触发器
需求:删除dept表的数据之后,在oper_log中记录日志
 */
drop trigger if exists trigger_dept_delete;

create trigger trigger_dept_delete after delete on dept2 for each row
begin
    insert into oper_log(id, table_name, oper_type, oper_time, oper_id, oper_desc)
    values (null,'dept', 'drop', now(), old.id, concat('删除数据: id =', old.id , ', name = ', old.name));
end;

 

 

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

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

相关文章

玩手机数据集 8201张玩手机的照片,有对应的xml和txt文件,可以用于yolo训练

玩手机数据集 8201张玩手机的照片,有对应的xml和txt文件,可以用于yolo训练 玩手机数据集(Phone Usage Detection Dataset) 数据集概述 该数据集专为检测人们使用手机的行为设计,旨在帮助研究人员和工程师开发高效的…

openai最新o1上线(2024年09月12日)

gpt-4o-2024-08-06输出文本价格 10美元/M o1-preview输出价格 60美元/M https://lmarena.ai/?leaderboard 数字9.11和9.8谁大些 人工智能学习网站 https://chat.xutongbao.top/

240924-Windows映射网络驱动器的方法

在Windows上加载网络盘(映射网络驱动器)可以通过以下步骤完成: 方法一:通过文件资源管理器 打开文件资源管理器: 可以按 Win E 打开,或者直接点击任务栏上的文件资源管理器图标。 点击“此电脑”&#x…

macOS与Ubuntu虚拟机使用SSH文件互传

1.ubuntu配置: 安装openssh服务: sudo apt-get install openssh-server -y 查看服务启动状态: systemctl status ssh 2.macOS使用scp连接ubuntu并发送文件 查看ubuntu IP : ifconfigmacOS终端连接ubuntu : sc

Linux入门学习:进程概念

文章目录 1. 什么是进程?1.1 基本概念1.2 task_struct 2. 组织进程3. 查看进程3.1 父进程与子进程3.2 fork创建子进程3.3 kill3.4 /proc 1. 什么是进程? 1.1 基本概念 在课本的概念中,进程程序的一个执行实例,正在执行的程序。其…

『功能项目』3D模型动态UI显示【76】

本章项目成果展示 我们打开上一篇75主角属性值显示的项目, 本章要做的事情是将3D模型动态显示在主角属性展示界面 首先创建RawImage 调整尺寸 创建文件夹:RenderTexture 创建 Render Texture 创建Camera 在场景中放置一个主角预制体删除所有组件 清空标…

LVGL第一篇-了解lvgl显示原理以及使用C++移植

一、引言 在当今嵌入式系统与图形界面开发的广阔领域中,轻量级图形库 LVGL(Light and Versatile Graphics Library)恰似一颗璀璨耀眼的明星,正日益受到开发者们的热烈推崇与追逐。它以小巧精致之姿、高效卓越之能以及丰富多元之功…

计算机毕业设计之:宠物互助平台的微信小程序系统(源码+文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

读构建可扩展分布式系统:方法与实践14流处理系统

1. 流处理系统 1.1. 时间就是金钱 1.1.1. 从数据中提取有价值的知识和获得洞见的速度越快,就能越快地响应系统所观察的世界的变化 1.1.2. 信用卡欺诈检测 1.1.3. 网络安全中异常网络流量的捕获 1.1.4. 在支持GPS的驾驶应用程序中进行的实时路线规划 1.1.5. 社交…

函数计算 FC:首发 GPU 极速模式,更弹性、更降本

函数计算 FC 作为轻量灵活、事件驱动的全托管计算服务,一直以来以弹得更快、粒度更细、成本更低为广大开发者与企业客户所青睐。 2024 云栖大会上,函数计算 FC 为 AI 加码,首发 GPU 极速模式, 让 GPU 可以更弹性、更便宜。 阿里云…

【车联网安全】车端知识调研

一、CAN总线: 1、定义: CAN 总线相当于汽车的神经网络,连接车内各控制系统,其通信采用广播机制,各连接部件均可收发控制消息,通信效率高,可确保通信实时性。当前市场上的汽车至少拥有一个CAN网络&#xff0…

Java集合(下)

Map(重要) HashMap和Hashtable的区别 线程是否安全: HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap …

也遇到过 PIL Image “image file is truncated“的问题

背景前言 属于活久见系列,最近工作上遇了该问题! 背景:前端 APP使用 Android CameraX 的接口,拍摄并上传图片,然后 Python后端服务对图片裁剪与压缩处理。后端服务处理图片时有遇到image file is truncated的情况。还…

Spring AOP实现原理-动态代理

目录 代理的基础概念 示例1:静态代理(场景:客户通过中介租房东的房子) 示例2:JDK动态代理实现房东、中介出租房屋 示例3:CGLib动态代理实现房东出租房屋 示例4:观察Spring IOC容器中代理对象…

One-Class Classification: A Survey

I. INTRODUCTION 1.定义 OCC 是一种特殊的多类分类,训练数据仅来自单个正类。目标是学习表示和/或分类器,以便在推理过程中识别正类查询。 2.应用 异常图像检测、异常事件检测、生物识别(活体检测、反诈骗) 3.与其他领域的比…

Python连接Kafka收发数据等操作

目录 一、Kafka 二、发送端(生产者) 三、接收端(消费者) 四、其他操作 一、Kafka Apache Kafka 是一个开源流处理平台,由 LinkedIn 开发,并于 2011 年成为 Apache 软件基金会的一部分。Kafka 广泛用于构…

在Java中,关于final、static关键字与方法的重写和继承【易错点】

在Java中,关于final、static关键字与方法的重写和继承【易错点】 1.final方法不能被重写2.static方法不是重写,而是遮蔽3.final与static的组合4.final与继承5.static与继承 1.final方法不能被重写 如果父类中的方法被声明为final,那么这个方法…

开源音频处理项目推荐【持续更新】

Audacity 介绍:Audacity是一款功能强大的开源音频编辑软件,适用于多种操作系统,包括Windows、macOS和Linux。它支持多轨音频编辑、录制,并且提供了丰富的音频处理功能,如剪切、复制、粘贴、混音、降噪等 。Audacity的…

基于Python+flask+MySQL+HTML的全国范围水质分析预测系统,可视化用echarts,预测算法随机森林

1绪论 近年来,水质监测系统的进步显著,这在全球环保意识不断提升的背景下尤为明显。大量资源被投入到水质监测技术的研发和应用中,以不断优化监测效能。水资源的保护及健康环境的维护,这种趋势旨在提升人们生活质量,确…

微软宣称其新工具可纠正人工智能幻觉 但专家依然对此表示怀疑

人工智能经常胡言乱语,微软现在说它有办法解决这个问题,但我们有理由对此持怀疑态度。微软今天发布了一项名为"更正"(Correction)的服务,它可以自动修改人工智能生成的与事实不符的文本。Correction 首先会标…