【数据库系统概论】触发器
【数据库系统概论】触发器
概述
在数据库系统中,触发器(Trigger)是一种特殊的存储过程,当特定事件在数据库表上发生时,会自动执行。触发器主要用于确保数据的完整性、一致性和实现复杂的业务规则。触发器是由用户定义的,可以在以下事件发生时触发:
- INSERT:当在表中插入新记录时触发。
- UPDATE:当更新表中的记录时触发。
- DELETE:当删除表中的记录时触发。
触发器通常与表关联,并且可以在以下时间点上执行:
- BEFORE:在事件发生之前执行。
- AFTER:在事件发生之后执行。
- INSTEAD OF:用于视图,替代视图的插入、更新或删除操作。
触发器的用途和优点包括:
-
数据完整性:
- 确保数据库中的数据遵循定义好的规则。例如,可以使用触发器防止无效数据的插入或更新。
-
自动审计:
- 自动记录数据更改的历史。例如,记录谁在什么时候修改了哪些数据。
-
级联操作:
- 自动执行级联的更新或删除。例如,当删除某个客户时,自动删除与该客户相关的订单。
-
强制业务规则:
- 实现复杂的业务逻辑和验证。例如,确保某个字段的值在更新时始终满足特定条件。
触发器示例
CREATE TRIGGER update_stock
AFTER INSERT ON orders
FOR EACH ROW
BEGINUPDATE productsSET stock = stock - NEW.quantityWHERE product_id = NEW.product_id;
END;
触发器的组成部分
-
CREATE TRIGGER update_stock:
CREATE TRIGGER
是 SQL 语句,用于创建一个新的触发器。update_stock
是触发器的名称。你可以根据实际用途选择一个有意义的名称。
-
AFTER INSERT ON orders:
AFTER INSERT
指定了触发器的触发时间和触发事件。这个触发器在INSERT
操作完成之后触发。ON orders
表明这个触发器关联的是orders
表。当orders
表中有新记录插入时触发该触发器。
-
FOR EACH ROW:
- 指定触发器的作用范围,即对
orders
表的每一行插入操作都会执行一次触发器。
- 指定触发器的作用范围,即对
-
BEGIN … END:
BEGIN
和END
包含了触发器的主体,定义了触发器在触发时执行的操作。
-
UPDATE products:
UPDATE products
是 SQL 语句,用于更新products
表。
-
SET stock = stock - NEW.quantity:
SET stock = stock - NEW.quantity
指定了更新的具体操作:stock
是products
表中的一个字段。NEW.quantity
是插入到orders
表中的新记录的quantity
字段的值。NEW
关键字引用了触发INSERT
操作的新记录。
-
WHERE product_id = NEW.product_id:
WHERE product_id = NEW.product_id
指定了更新操作的条件:- 只有当
products
表中的product_id
字段值与插入到orders
表中的新记录的product_id
字段值相匹配时,才会执行更新操作。
- 只有当
触发器的作用
这个触发器的主要作用是自动更新库存数量。当在 orders
表中插入一条新订单记录时,该触发器会自动减少 products
表中相应产品的库存数量。具体来说:
- 当新订单插入
orders
表时,触发器会自动计算该订单中每种产品的购买数量(NEW.quantity
)。 - 然后,触发器会在
products
表中找到对应的产品(通过NEW.product_id
匹配products
表中的product_id
字段),并减少相应的库存数量(stock
)。
示例情景
假设 orders
表中插入了一条新记录:
INSERT INTO orders (order_id, product_id, quantity) VALUES (1, 101, 5);
在这条记录中:
order_id
是 1。product_id
是 101。quantity
是 5。
触发器会执行以下操作:
UPDATE products
SET stock = stock - 5
WHERE product_id = 101;
这意味着 products
表中 product_id
为 101 的产品库存会减少 5 个单位。
总结
这个触发器实现了当有新订单插入时,自动调整产品库存的功能。这有助于确保库存数据的实时更新,保持数据库的一致性和完整性。
注意事项
尽管触发器非常强大,但在使用时需要注意以下几点:
-
性能:
- 过多的触发器可能影响数据库性能,尤其是在处理大量数据时。
-
调试和维护:
- 触发器代码的调试和维护可能比较复杂,尤其是在触发器之间存在依赖关系时。
-
可读性:
- 过多的业务逻辑嵌入到触发器中可能导致代码难以理解和维护。需要在数据库层和应用层之间找到适当的平衡。
触发器是强大的工具,用于确保数据库中的数据符合预定义的规则和业务逻辑,有助于保持数据的一致性和完整性。
相关文章:
【数据库系统概论】触发器
【数据库系统概论】触发器 概述 在数据库系统中,触发器(Trigger)是一种特殊的存储过程,当特定事件在数据库表上发生时,会自动执行。触发器主要用于确保数据的完整性、一致性和实现复杂的业务规则。触发器是由用户定义…...

小白跟做江科大32单片机之按键控制LED
原理部分 1.LED部分使用的是这样的连接方式 2.传感器模块的电路图 滤波电容如果接地,一般用于滤波,在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大,就能把电压值对应到相应的电压值 比较器部分 如果A端电压>B端电压&am…...
每天写java到期末考试(6.6)-java文件输入输出流实验
1、用字节流读写二进制文件 要求:用DataOutputStreamFileOutputStream类将1,2,…,100,这100个数字写入到文件 d:\out1.bin里,然后再用DatalnputStreamFilelnputStream类将d:\out1.bin的内读出来,并输出到屏幕上。 用DataOutputStreamFileOutputStream写入二进制数据时,直接调…...

Word2021中的The Mathtype DLL cannot be found问题解决(office 16+mathtype7+非初次安装)
问题描述,我的问题发生在word中无法使用自定义功能区中的mathtype 我的环境是:W11Word2021mathtype7 因为我是第二次安装mathtype7,所以我怀疑是因为没有卸载干净,于是我参考了下面这篇文章的做法 参考文章 1.首先重新卸载当前的…...
【Android面试八股文】在Java中传参数时是将值进行传递,还是传递引用?
在Java中传参数时是将值进行传递,还是传递引用? 这道题想考察什么? 是否了解什么是值传递和引用传递与真实场景使用,是否熟悉什么是值传递和引用传递在工作中的表现是什么? 考察的知识点 什么是值传递和引用传递的概念,两者对开发中编写的代码的影响 考生应该如何回…...

神经网络 torch.nn---Linear Layers(nn.Linear)
torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.nn — PyTorch 2.3 documentation nn.Linear torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone) 参数: in_features - 每个输入样本的大小out_features - 每个输出…...

PPT视频如何16倍速或者加速播放
有两种方式,一种是修改PPT本身,这种方式非常繁琐,不太推荐,还有一种就是修改视频本身,直接让视频是16倍速的视频即可。 如何让视频16倍速,我建议人生苦短,我用Python,几行代码&…...

【ai】DeepStream 简介
NVIDIA Metropolis 平台。 NVIDIA 大都会 利用视觉 AI 将来自数万亿物联网设备的数据转化为有价值的见解。 NVIDIA Metropolis 是一个应用程序框架、一套开发工具和合作伙伴生态系统,它将视觉数据和 AI 结合在一起,以提高各行各业的运营效率和安全性。它有助于理解数万亿个…...

如何学习使用淘宝API?淘宝API运营场景
学习使用淘宝API涉及对其功能、分类、调用方法及实际应用的综合理解。下面按部分详细解释如何系统地学习和掌握淘宝API的使用: 淘宝API接口入门 了解淘宝开放平台:淘宝开放平台为开发者提供了一个可以与淘宝数据进行交互的平台,涵盖了丰富的A…...
Java 面试题:Java 的动态代理是基于什么原理?
编程语言通常有各种不同的分类角度,动态类型和静态类型就是其中一种分类角度,简单区分就是语言类型信息是在运行时检查,还是编译期检查。 与其近似的还有一个对比,就是所谓强类型和弱类型,就是不同类型变量赋值时&…...

Python logging 模块详解
Python 的 logging 模块提供了一个强大而灵活的日志系统。它是 Python 标准库的一部分,因此可以在任何 Python 程序中使用。logging 模块提供了许多有用的功能,包括日志消息的级别设置、日志消息的格式设置、将日志消息输出到不同的目标,以及…...

http://account.battlenet.com.cn
http://account.battlenet.com.cn 魔兽战网 短信验证 查了下,我老早以前账号还在,纪念下,少玩游戏。...

java第二十课 —— 面向对象习题
类与对象练习题 编写类 A01,定义方法 max,实现求某个 double 数组的最大值,并返回。 public class Chapter7{public static void main(String[] args){A01 m new A01();double[] doubleArray null;Double res m.max(doubleArray);if(res !…...
Flask的模块化实践
既作为前端,又作为后端的我,写flask写了那么多行了,其实它们属于不同的模块,比如登录,注册,聊天,用户画像,那我觉得有必要分一下了,系统化的处理一下,不然找个…...

锁存器(Latch)的产生与特点
Latch 是什么 Latch 其实就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息。锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效&#…...

搜维尔科技:「案例」Faceware电影中面部动画的演变历程
面部动画是电影中角色表演的一个重要方面,尤其是在严重依赖电子动画、化妆效果和动作捕捉系统的奇幻电影中。在《龙与地下城:盗贼荣誉》电影中,龙裔角色的面部动画是一个复杂的系统,使该生物在大屏幕上栩栩如生。该系统依赖于一种…...

特征工程技巧—Bert
前段时间在参加比赛,发现有一些比赛上公开的代码,其中的数据预处理步骤值得我们参考。 平常我们见到的都是数据预处理,现在我们来讲一下特征工程跟数据预处理的区别。 数据预处理是指对原始数据进行清洗、转换、缩放等操作,以便为…...
更改 Docker 的默认存储位置
记录一下使用 Docker 遇到的问题,Docker 也用得比较多,最近发现根目录所在磁盘快满了,发现是 Docker 默认会将镜像和容器等数据保存在目录 /var/lib/docker 目录下,我们可以更改 Docker 的默认存储位置,比如改到数据盘…...

搜索与图论:图中点的层次
搜索与图论:图中点的层次 题目描述参考代码 题目描述 输入样例 4 5 1 2 2 3 3 4 1 3 1 4输出样例 1参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n, m; int h[N], e[N]…...
NLP入门——数据预处理:编码规范化
编码规范化 在计算机中,我们需要将字符与字节序列之间建立起映射关系,这个过程被称为编码。有许多不同的编码方式,例如 ASCII、UTF-8、UTF-16 和 GBK 等。这些编码方式会将每个字符编码为一个或多个字节,以便于在计算机、网络和其…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...