《数据库开发实践》之触发器【知识点罗列+例题演练】

一、什么是触发器?

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/284247.html

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

相关文章

在线课程学习管理

### 起步1. 使用 IDEA 导入项目 2. 执行 sql 目录下的online_study_system.sql 文件 3. 修改 mysql.properties 中数据库连接信息 4. 运行程序| 用户名| 密码 | | ------------- |:-------------| | admin | 123 | | 李老师 | 123 | | 张老师 | 123 | | 刘老师 | 123 | | 曹老师…

【Redis技术专区】「原理分析」探讨Redis6.0为何需要启用多线程

探讨Redis 6.0为何需要启用多线程 背景介绍开启多线程多线程的CPU核心配置IO多线程模式单线程处理方式多线程处理方式 为什么要开启多线程?充分利用多核CPU提高网络I/O效率响应现代应用需求 多线程实现启用多线程 最后总结 背景介绍 在Redis 6.0版本中,…

Qt+Opencv:人脸检测

话接上一篇,我们仍使用在上篇《QtOpencv:Qt中部署opencv》创建的Qt项目来测试opencv提供的sample。 在正式开始本篇之前,我们先说做一下准备工作: 一、opencv官方文档 学习最权威和最可靠的方式,就是阅读官方文档和…

扩散式过滤器 水泵角通除污器 0阻力过滤器直角过滤器工作原理

​ 1:扩散式除污器过滤器介绍 扩散除污器是一种在多个领域都有应用的设备,例如在泵站中用于拦截介质中的杂质,净化介质,保护管路,提高水泵效率,延长水泵寿命等。它还可以方便地进行变径处理,可以…

互联网大厂面试题目

阿里篇 1.1.1 如何实现一个高效的单向链表逆序输出? 1.1.2 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位 1.1.3 给定一个二叉搜索树(BST),找到树中第 K 小的节点 1.1.4 LRU缓存机制 1.1.5 关于epoll和…

【大数据Hive】hive 运算符使用详解

目录 一、前言 二、hive 运算符分类 三、hive 运算符操作演示 3.1 数据准备 创建表dual 加载一个文件dual.txt到dual表中 模拟测试 3.2 关系运算符 is null空值判断 is not null 非空值判断 like使用 3.3 算术运算符 取整操作 取余操作: % 位与操作: & …

ES应用_ES原理

1 ES简介 Elasticsearch:基于Apache Lucene并使用Java开发的分布式开源搜索和分析引擎。是 Elastic Stack 的核心,它集中存储您的数据。 Elastic Stack:包括 Elasticsearch、Logstash 、 Kibana 和Beats (也称为 ELK Stack&…

next.js 开发网站的hello world

本文介绍建立一个简单的next.js 工程,以及简单修改。然后也简单说了2种路由方式的选择。 开始next.js工程前需要node.js , 还需要编辑器,我这里选择的是visual code。如果没有安装node.js 请参考下: visual code 下的node.js的he…

redis容灾的方案设计

背景 今年各个大厂的机房事故频繁,其中关键组件Redis是重灾区,本文就来看下怎么做Redis的多机房容灾 Redis多机房容灾方案 1.首先最最直观的是直接利用Redis内部的主从数据同步来进行灾备,但是由于Redis内部的主从实现对机房间的网络延迟等…

归并算法排序

目录 归并排序 逆序对的数量 归并排序 题目如下: 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式: 输入共两行,第一行包含整数 n。 第二行包含 n 个整数&…

16.综合项目实战

一、基础演练: 1、建库、建表 # 创建数据库 create database mysql_exampleTest; use mysql_exampleTest; # 学生表 CREATE TABLE Student( s_id VARCHAR(20), s_name VARCHAR(20) NOT NULL DEFAULT , s_birth VARCHAR(20) NOT NULL DEFAULT , s_sex VARC…

[react]脚手架create-react-app/vite与reac项目

[react]脚手架create-react-app/vite与reac项目 环境问题描述create-react-app 脚手架根据脚手架修改项目结构安装脚手架注入配置文件-config文件夹package.json文件变更删除 serviceWorker.js新增reportWebVitals.js文件更新index.js文件 脚手架creat-react-app 缺点 vite 脚手…

msvcp140_1.dll丢失怎样修复,缺失msvcp140_1.dll是什么原因

在日常使用电脑的过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp140_1.dll丢失”。那么,msvcp140_1.dll究竟是什么文件?为什么会出现丢失的情况?又该如何解决这个问题呢?本文将详细介绍msvcp140_1…

CSS去掉按钮阴影 | css去掉按钮边框 | 注意改变搜索的关键词、搜索方式

上图是在谷歌浏览器中运行的结果 button {box-shadow: none;height: 50px;width: 100px;background-color: white;border-color: white; }写了以上的css,发现按钮还是有阴影一样的东西,查阅网络资料的时候也一直在搜索“如何去掉按钮阴影”,…

MK米客方德品牌 SD NAND在对讲机领域的引领作用

SD NAND在对讲机上的应用 SD NAND在对讲机上广泛应用,为其提供了高效可靠的存储解决方案。 这种存储技术不仅能容纳大量语音和数据文件,而且具有高速读取的特点,保障了实时通信的质量。SD NAND还注重安全性,通过数据加密和访问控…

cnPuTTY CAC 0.80—PuTTY CAC 0.80中文版本简单说明~~

随着PuTTY 0.80在2023-12-18发布,PuTTY CAC也同步进行了更新。 PuTTY CAC 0.80同步更新了针对Terrapin攻击(CVE-2023-48795)的修改,除了这些还进行了额外的添加和修改。另外来自cnPuTTY CAC自身也进行了小的修改。更多详细的内容请参考以下内容。 首先&…

C++/CLI——2类和对象生存期

C/CLI——2函数与类的使用方法 函数使用 定义函数和使用函数基本与C#相同,只不过C/CLI可以像标准C一样,可以先声明函数原型,再定义函数主体。值得注意的是,如果有默认参数,只能在函数原型中定义,不能在函…

2023,最后

最后一天确实来得飞快,今年也不算什么特殊的一年,所以总结似乎也显得没有特别重要,但是既然它来了,也就要走了,老子也顺道给他做一次结束的话。 ——我和我的技术交流群 启发和启发的朋友们是2023年我特别关注的一群人…

Yapi接口管理平台Centos7容器部署

文章目录 0.Docker部署1.Docker部署1.1 MongoDB1.2 下载 Yapi 镜像1.3 初始化数据库1.4 启动 Yapi 服务1.5 访问 Yapi 2.docker-compose部署2.1 创建容器网络2.2 创建2.3 创建 mongodb-compose2.4 创建 yapi-compose2.5 启动容器2.6 访问 Yapi 0.Docker部署 参考:C…

1.5 FMEA项目规划:5T

文章目录 1.5.1 FMEA目的1.5.2 FMEA时间节点1.5.3 FMEA团队1.5.3.1 设计FMEA团队1.5.3.2 过程FMEA团队1.5.3.3 FMEA团队角色和职责 1.5.4 FMEA任务1.5.5 FMEA工具 为确保及时获得最佳效果并避免FMEA返工,以下五个主题应在设计FMEA和过程FMEA开始时讨论,它…