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

news2024/11/28 2:56:05

一、什么是触发器?

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:这里因为之前创建了一个重名的触发器,也是执行相应操作,数据才会加了两次) 

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

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

相关文章

idea 如何快速拉取新分支

方式1 (快捷键:CtrlShift~) 方式2:(快捷键:Alt9)

小梅哥Xilinx FPGA学习笔记18——专用时钟电路 PLL与时钟向导 IP

目录 一:IP核简介(具体可参考野火FPGA文档) 二: 章节导读 三:PLL电路原理 3.1 PLL基本实现框图 3.2 PLL倍频实现 3.3 PLL分频实现 四: 基于 PLL 的多时钟 LED 驱动设计 4.1 配置 Clocking Wizard 核 4.2 led …

详解结构体(包含结构体内存对齐,柔性数组,位段)【尊嘟很详细】

​ 结构体 结构体是一些值的集合,这些值称为成员变量,结构的成员可以是标量、数组、指针,甚至是其他结构体。 成员名可以与程序中其它变量同名,互不干扰。 结构体的定义 (struct结构名{}) struct books {int a;c…

Aseprite编译

官方网站 : https://www.aseprite.org/ Aseprite编译 步骤 : 1> App Store 下载安装 XCode 2> 安装 brew # /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 或 # /bin/zsh -c "$(curl -fsSL https://g…

处理HTTP错误响应:Go语言中的稳健之道

开场白:在Web开发中,HTTP错误响应是不可避免的一部分。当请求无法成功完成时,服务器会返回一个错误响应。今天,我们将深入探讨如何在Go语言中优雅地处理这些HTTP错误响应。 知识点一:HTTP错误响应的常见类型HTTP错误响…

初步认识API安全

一、认识API 1. 什么是API API(应用程序接口):是一种软件中介,它允许两个不相关的应用程序相互通信。它就像一座桥梁,从一个程序接收请求或消息,然后将其传递给另一个程序,翻译消息并根据 API 的程序设计执行协议。A…

使用spring boot实现异常的统一返回

在这个前后端分离的时代,一个 统一的数据格式非常重要。本次我们实现用spring boot实现一下返回给前端数据的统一格式,不再出现服务器500的错误。 新建一个spring boot项目,并导入knife4j的依赖。 写一个controller控制器,用来是…

JDK17:Java LinkedList源码解读

1. LinkedList简介 LinkedList是List接口的实现类,基于双向链表实现,继承自AbstractSequentialList类,同时也实现了Cloneable、Serializable接口。此外还实现了Queue和Deque接口,可以作为队列或双端队列使用。 LinkedList的插入删…

Starling-LM-7B与GPT-4:开源AI的新纪录

引言 在人工智能的前沿领域,Starling-LM-7B的出现标志着开源大型语言模型(LLM)的一大突破。与GPT-4的近距离竞争不仅展示了Starling-LM-7B的技术实力,也突显了开源社区在推动AI发展方面的重要作用。 模型特点 Starling-LM-7B&a…

算法学习系列(十五):最小堆、堆排序

目录 引言一、最小堆概念二、堆排序模板(最小堆)三、模拟堆 引言 这个堆排序的话,考的还挺多的,主要是构建最小堆,并且在很多情况下某些东西还用得着它来优化,比如说迪杰斯特拉算法可以用最小堆优化&#…

初识C语言·字符(串)函数

目录 1 字符分类函数 2 字符转换函数 3 strlen的模拟实现 4 strcpy的使用和模拟实现 5 strcat的使用和模拟实现 6 strcmp的使用和模拟实现 7 strncpy strncat strncmp的使用和模拟实现 8 strstr的使用和模拟实现 9 strerror的使用 10 strtok的使用 1 字符分类函数 C语…

Java ArrayList在遍历时删除元素

文章目录 1. Arrays.asList()获取到的ArrayList只能遍历,不能增加或删除元素2. java.util.ArrayList.SubList有实现add()、remove()方法3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素3.1 普通for循环3.2 增强for循环3.3 forEach循环3.4 str…

Qt(二):使用udp发送与接收图片

使用Qt来通过UDP协议发送和接收图片可以分为几个步骤。以下是一个基本的指南: 发送图片准备图片数据:首先,你需要将图片转换为可以在网络上传输的数据格式。通常,这涉及到将图片转换为字节数组。设置UDP套接字:在Qt中…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束:any三、支持比较操作的内置约束:comparable四、自定义约束五、类型集合(type set)六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

水果软件2024FL Studio21.3mac苹果中文版

FL STUDIO21发布,提供您一直在等待的出色工作流程功能。通过新效果、多个播放列表曲目选择和无所畏惧的撤消一切编辑,将您的音乐带入2024年。FL Studio21中文完整版是一个功能齐全、开放式架构的PC音乐创作和制作环境。它具有基于音乐音序器的图形用户界…

uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新

实现登录即更新,或实时监听更新 本文介绍的是在App打开启动的时候调用更新,点击下方链接,查看使用WebSocket实现实时通知在线用户更新。 uniapp:全局消息是推送,实现app在线更新,WebSocket,ap…

白话机器学习的数学-1-回归

1、设置问题 投入的广告费越多,广告的点击量就越高,进而带来访问数的增加。 2、定义模型 定义一个函数:一次函数 y ax b (a 是斜率、b 是截距) 定义函数: 3、最小二乘法 例子: 用随便确定的参…

常见HTTP 500错误发生原因及解决办法剖析

​  对于网站运营者来说,提到500内部服务器错误并不陌生。互联网行业对它的称呼有好几种,如“500内部服务器错误”、“HTTP 500 - 内部服务器错误”、“临时错误 (500)”、“内部服务器错误”。尽管叫法不同,但根本问题是相同的。 目前&…

【Shell编程练习】通过位置变量创建 Linux 系统账户及密码

系列文章目录 输出Hello World 系列文章目录位置变量代码实现运行结果 位置变量 位置变量将以数字方式对变量进行命名,可将命令行参数的值存储到脚本中。要从命令行、函数或脚本执行等处传递参数时,就需要在 Shell 脚本中使用位置参数变量。下表为常用…

git unable to create temporary file: No space left on device(git报错)

1.问题 1.1 vscode中npm run serve跑项目的时候,进度达到95%的时候一直卡着无进度; 1.2 git命令提交代码报错; 2.具体解决 这个错误通常表示你的磁盘空间已经满了,导致 Git 无法在临时目录中创建文件。2.1 清理磁盘空间&#xf…