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

一、什么是触发器?

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_eventON 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.hqwc.cn/news/305724.html

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

相关文章

NFC物联网智能锁安全测试研究

针对短距离无线通信在物联网智能锁实际运用中的安全机制问题,通过理论分析和实际操作演示潜在的攻击流程,发现其存在的安全漏洞并提出可行的加固方法,并对加固后的通信系统进行CPN建模与安全性分析,对无线通信协议的安全性能提升、…

动态内存管理(2)

目录 4. 几个经典的笔试题 4.1 题目1: 4.2 题目2: 4.3 题目3: 4.4 题目4: 5. C/C程序的内存开辟 6. 柔性数组 6.1 柔性数组的特点: 6.2 柔性数组的使用 6.3 柔性数组的优势 4. 几个经典的笔试题 4.1 题目1&#xff1a…

生存分析序章3——生存分析之Python篇:介绍生存分析和scikit-survival库

写在开头 在现代数据科学领域,生存分析是一项关键的统计方法,用于研究个体在一定时间内事件发生的概率。无论是医学、金融还是社会科学,生存分析都为我们提供了一种深入洞察数据的途径。在Python生态系统中,有一个强大的工具——…

HarmonyOS 签名打包Hap(s)、App(s)

1. 基本概念 HarmonyOS应用通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用的完整性,数字证书和Profile文件可通过申请发布证书和Profile文件获取。   申请数字证书和Profile文件前,首先需要通…

【ES】es介绍

倒排索引(Inverted Index)和正排索引(Forward Index) 正排索引是一种以文档为单位的索引结构,它将文档中的每个单词或词组与其所在的文档进行映射关系的建立。正排索引通常用于快速检索指定文档的内容,可以…

一键访问多功能数据解决方案:如何轻松构建和管理APITable智能多维表格

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台,是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

【JS逆向学习】有道翻译接口参数逆向

逆向目标 目标:有道翻译接口加密参数接口:https://dict.youdao.com/webtranslate加密参数: sign: e3d8fa747713d6957db7cd2eedaa0d95Cookie: OUTFOX_SEARCH_USER_ID696102715114.222.69.137; OUTFOX_SEARCH_USER_ID_NCOO304412380.2597743 …

出现频率高达70%软件测试面试题及答案!——看完面试官:是你面试我还是我面试你啊!

【纯干货!!!】花费了整整3天,整理出来的全网最实用软件测试面试大全,一共30道题目答案的纯干货,希望大家多多支持,建议 点赞!!收藏!!长文警告&…

千巡翼X4轻型无人机 赋能智慧矿山

千巡翼X4轻型无人机 赋能智慧矿山 传统的矿山测绘需要大量测绘员通过采用手持RTK、全站仪对被测区域进行外业工作,再通过方格网法、三角网法、断面法等进行计算,需要耗费大量人力和时间。随着无人机航测技术的不断发展,利用无人机作业可以大…

分享:新手程序员接单一个月,收入3375元

今年刚开始接触外包接单,从注册到现在接到了一个单子,赚了3000多块钱。 赚的钱不多,期间踩的坑倒是不少,给大家挨个唠唠…… 1 一定要完善好自己的简历项目 在外包平台上接单,简历上的项目是重中之重。跟传统的招聘不…

算法基础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…

软件测试/测试开发丨学习笔记之Docker常用命令

Docker常用的容器管理命令 docker run –name{your_name} –d {image_name} (运行容器) -d 后台运行docker ps -s -a {查看当前所有容器}docker stop {container_name} (停止容器)docker kill (container_name) {杀死容器}docker rm -f {container_name} (删除容器)docker log…