《数据库开发实践》之触发器

一、什么是触发器?

1.概念:

简单来说触发器就是一种特殊的存储过程,在数据库服务器触发事件的时候会自动执行其SQL语句集。

2.构成四要素:

(1)名称:要符合标识符命名规则

(2)定义的目标:必须要定义在表上或者视图上

(3)触发逻辑:触发事件之后如何处理

(4)触发事件类型:

在MySQL中,触发器有时候需要同时表示某个字段更新前后的数据,或者新增的、删除的数据。因此:

  • “NEW.列名”表示新增数据行的列或更新后的列
  • “OLD.列名”表示更新或删除它之前的已有行的列
触发事件类型NEW和OLD的使用
INSERTNEW表示将要或者已经新增的数据
UPDATEOLD用来表示将要或者已经被删除的数据,NEW表示将要或者已经修改的数据
DELETEOLD表示将要或者已经被删除的数据

3.种类:

触发器类型描述
Before触发器在触发事件发生之前执行的触发器
After触发器在触发事件发生之后执行的触发器

4.与存储过程的区别:

两者最明显的区别就是调用执行方式的不同。

触发器

主要是通过事件进行触发而被执行的,具有极强的及时性,代码量也不大,无需人工手动干预去执行。

因而也具有一定的缺点,就是性能不高,因为触发器基于行的变化而触发,所以增删改的操作可能都会激活触发器,可移植性不高,就和存储过程一样,也就是创建好后若是想要去更改里面触发事件执行的SQL语句集,是修改不了的,只能通过删掉重建

存储过程可以通过存储过程名字结合CALL语句而被直接调用。

二、触发器的作用是什么?

简单一句话来说就是用于强制执行业务规则和数据完整性.

(1)强化约束:能够实现比约束更为复杂的业务规则约束;

(2)跟踪变化:侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化,以防止恶意的或者不正确的插入、更新和删除操作;

(3)级联运行:可以侦测数据库内的操作,自动地级联影响整个数据库的相关内容;

(4)差异记录:触发器能够找出某一表在数据修改前后状态发生的差异。并且还可以根据差异执行相应的处理

三、MySQL语句创建、查看(验证)、删除触发器

1.创建触发器

MySQL创建触发器语句的语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event

ON tb_name FOR EACH ROW trigger_stmt

a. trigger_name:触发器名称。


b.trigger_time:触发时机。也就是选择哪一种触发器,可以是Before也可以是After,表示触发器是在激活其语句之前还是之后触发。


c.trigger_event:触发事件类型。


d.tb_name:建立触发器的基础表。这里要注意的是同一个表不能拥有两个具有相同触发时机和事件的触发器,如果出现两个相同的,那么在语句激活的时候,系统此时不是不知道选择哪一个触发器去执行相应操作,而是会两个一起执行。


e.FOR EACH ROW:表示受触发器影响的每一行激活触发器的动作。比如,对于插入多行数据的sql语句,触发器便会对要插入数据的行执行相应的触发器操作。


f.trigger_stmt:触发器的程序体,也就是触发器激活时要执行的语句集。当需要执行多条语句的时候,需要使用Begin开始标志和End结束标志。

2.查看验证触发器

MySQL查看所有触发器情况语句的语法如下:

SHOW TRIGGERS;

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME=trigger_name;

其中,trigger_name表示要查看的触发器的名称。

3.删除触发器

MySQL删除触发器语句的语法如下:

DROP TRIGGER 触发器名

四、例题演练

1、创建一个触发器tr_delb:

在图书管理系统中,若删除书籍信息(bookinfo 表)时,需同时删除所有该书籍的借阅信息(BookLended 表)。需实现上述功能,且需通过数据进行验证。

delimiter //
create trigger tr_delb After delete 
on bookinfo  FOR EACH ROW       
begin
delete from booklended where bookid=old.bookid;
end //
delimiter;

(1)创建成功:

(2)删除操作前两张表:

(3)删除操作后两张表:

delete from bookinfo where bookname='数据库系统原理及应用';

2、创建一个触发器tr_upnum。

在图书管理系统中,若插入书籍借阅信息(BookLended 表)时,需同时更新读者表(reader)中该读者的借阅书籍本数(num字段),在原有借阅书籍本数上加1。需实现上述功能,且需通过数据进行验证。

delimiter //
create trigger tr_upnum After insert
on booklended FOR EACH ROW
begin
update reader set num=num+1 where readerid=new.readerid;
end //
delimiter;

(1)创建成功:

(2)添加信息前两张表:

(3)添加信息后两张表:

mysql> insert into booklended(bookid,readerid,lendtime,backtime) values ('21-03-01-012024','1000003112',now(),now());

(ps:这里因为之前创建了一个重名的触发器,也是执行相应操作,数据才会加了两次) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解io/nio/netty

一、io io即input/output,输入和输出 1.1 分类 输入流、输出流(按数据流向) 字节流(InputStream/OutputStream(细分File/Buffered))、字符流(Reader/Writer(细分File/Buffered/pu…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是: 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

git 如何将某个分支的某个提交复制到另外一个分支

请直接去看原文: 原文链接:git 如何将某个分支的某个提交复制到另外一个分支_gitlab里面的markdown文件可以复用其他分支的吗-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------…

删除数据后, redis 内存占用还是很高怎么办?

现象: reids 做了数据删除,数据量不大,使用 top 命令看,发现还是占用大量内存 原因: 1.redis 底层内存根据内存分配器分配,不会立刻释放 2.redis 释放的内存空间不是连续的,存在碎片 内存碎…

算法基础day2

前缀和 #include <iostream> using namespace std; const int N100010; int n,m; int a[N],s[N]; int main() {scanf("%d%d",&n,&m);for(int i1;i<n;i) scanf("%d",&a[i]);for(int i1;i<n;i) s[i]s[i-1]a[i];while(m--){int l,r;s…

HTML-基础知识-基本结构,注释,文档说明,字符编码(一)

1.超文本标记语言不分大小写。 2.超文本标签属性名和属性值不区分大小写。 3.超文本标签属性值重复&#xff0c;听取第一个。 4.html结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…

19个Python语法糖和9个内置装饰器

19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验 文章目录 19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验1. 联合运算符Union Operators&#xff1a;合并 Python 字典的最优雅方式2. 类型提示Type Hints&#xff1a;使您的 Python 程序…

常用的几款性能测试软件

&#xff1a; Apache JMeter是一款免费、开源的性能测试工具&#xff0c;广泛应用于Web应用程序和服务的性能测试。它支持模拟多种不同类型的负载&#xff0c;可以测试应用程序在不同压力下的性能表现&#xff0c;并提供丰富的图表和报告来分析测试结果。 优点&#xff1a; …

Python新年炫酷烟花秀代码

新年马上就要到来&#xff0c;烟花秀必须得安排上&#xff01; Pygame 绘制烟花的基本原理 1&#xff0c;发射阶段&#xff1a;在这一阶段烟花的形状是线性向上&#xff0c;通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动&#xff0c;运动过程中 5个点被赋…

使用pytorch搭建ResNeXt并基于迁移学习训练

冻结除最后全连接层以外的所有权重&#xff0c;只去单独训练它最后一层的的权重&#xff0c;这个方法&#xff0c;冻结了所有网络的权重。 for param in net.parameters():param.requires_grad False

vue+element+springboot实现多张图片上传

1.需求说明 2.实现思路 3.el-upload组件主要属性说明 4.前端传递MultipartFile数组与服务端接收说明 5.完整代码 1.需求说明 动态模块新增添加动态功能,支持多张图片上传.实现过程中对el-upload组件不是很熟悉,踩了很多坑,当然也参考过别的文章,发现处理很…

使用c语言实现DH秘钥分配算法

使用c语言实现DH秘钥分配算法 DH算法原理 密钥分配 选择一个大素数p&#xff0c; 选择一个整数g(g < p)&#xff1b;通信方A选择一个随机数a&#xff0c;并发送 mod p 给 通信方B&#xff1b;通信方B选择一个随机数b&#xff0c;并发送 mod p 给 通信方A&#xff1b;通信…

日常中msvcp120.dll丢失五种解决方法

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。那么&#xff0c;msvcp120.dll到底是什么&#xff1f;它的作用又是什么呢&#xff1f;为什么会出现丢失的情况呢&#xff1f;本文将为您详细介绍msvcp120.dll的相…

数据结构初阶之顺序表(C语言实现)

数据结构初阶之线性表&#xff08;C语言实现&#xff09; &#x1f34f;前言&#xff1a;&#x1f34f;顺序表和数组的区别&#x1f34f;动态顺序表的模拟实现&#x1f340;动态顺序表的基本结构设计&#x1f340;动态顺序表的各种功能模拟实现&#x1f432; 初始化&#xff08…

兔子目标检测数据集VOC格式3900张

兔子是一类可爱的哺乳动物&#xff0c;拥有圆润的脸庞和长长的耳朵&#xff0c;身体轻盈柔软。它们通常是以温和和友善的形象出现在人们的视野中&#xff0c;因此常常成为童话故事和卡通形象中的角色。 兔子是草食性动物&#xff0c;主要以各种草本植物为食&#xff0c;包括草…

【八】【C语言\动态规划】1567. 乘积为正数的最长子数组长度、413. 等差数列划分、978. 最长湍流子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

git 学习 之一个规范的 commit 如何写

最好的话做一件完整的事情就提交一次

状态管理概述

ArkTS UI的状态管理到这里就叙述完了&#xff0c;现在做一个概述&#xff0c;也可以认为是一个总结。 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回…

Vue(一):Vue 入门与 Vue 指令

Vue 01. Vue 快速上手 1.1 Vue 的基本概念 用于 构建用户界面 的 渐进性 框架 构建用户界面&#xff1a;基于数据去渲染用户看到的界面渐进式&#xff1a;不需要学习全部的语法就能完成一些功能&#xff0c;学习是循序渐进的框架&#xff1a;一套完整的项目解决方案&#x…

探索Apache Commons Imaging处理图像

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊图像处理。在这个数字化日益增长的时代&#xff0c;图像处理已经成为了一个不可或缺的技能。不论是社交媒体上的照片编辑&#xff0c;还是专业领域的图像分析&#xff0c;图像处理无处不在。而作为…