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

一、什么是触发器?

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.mzph.cn/news/583000.shtml

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

相关文章

[OCR]Python 3 下的文字识别CnOCR

目录 1 CnOCR 2 安装 3 实践 1 CnOCR CnOCR 是 Python 3 下的文字识别(Optical Character Recognition,简称OCR)工具包。 工具包支持简体中文、繁体中文(部分模型)、英文和数字的常见字符识别,支持竖…

基于Java+SpringBoot+vue实现图书借阅管理系统

基于JavaSpringBootvue实现图书借阅和销售商城一体化系统 🍅 作者主页 程序设计 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录 基于JavaSpringBootvue实现图书借阅和销售商城一体化…

elasticsearch-hadoop.jar 6.8版本编译异常

## 背景 重新编译 elasticsearch-hadoop 包; GitHub - elastic/elasticsearch-hadoop at 6.8 编译 7.17 版本时很正常,注意设置下环境变量就好,JAVA8_HOME/.... 编译 6.8 版本时(要求jdk8 / jdk9),出现…

腾讯云轻量服务器和云服务器CVM该怎么选?区别一览

腾讯云轻量服务器和云服务器CVM该怎么选?不差钱选云服务器CVM,追求性价比选择轻量应用服务器,轻量真优惠呀,活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三…

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

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

Java 缓存中间件

Java 缓存中间件 关键词:Spring Cache、J2Cache、JetCache 一 、JSR 107 JSR107 中制订了 Java 缓存的规范。 因此,在很多缓存框架、缓存库中,其 API 都参考了 JSR 107 规范。 img Java Caching 定义了 5 个核心接口 CachingProvider - 定义…

合并区间(LeetCode 56)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输…

MetalLB:本地Kubernetes集群的LoadBalancer负载均衡利器

背景 在本地集群进行测试时,我们常常面临一个棘手的问题:Service Type不支持LoadBalancer,而我们只能选择使用NodePort作为替代。这种情况下,我们通常会配置Service为NodePort,并使用externalIPs将流量导入Kubernetes…

SpringBoot多线程与任务调度总结

一、前言 多线程与任务调度是java开发中必须掌握的技能,在springBoot的开发中,多线程和任务调度变得越来越简单。实现方式可以通过实现ApplicationRunner接口,重新run的方法实现多线程。任务调度则可以使用Scheduled注解 二、使用示例 Slf…

微软发布安卓版Copilot,可免费使用GPT-4、DALL-E 3

12月27日,微软的Copilot助手,可在谷歌应用商店下载。目前,只有安卓版,ios还无法使用。 Copilot是一款类ChatGPT助手支持中文,可生成文本/代码/图片、分析图片、总结内容等,二者的功能几乎没太大差别。 值…

【小程序】如何获取特定页面的小程序码

一、进入到小程序管理后台,进入后点击上方的“工具”》“生成小程序码” 小程序管理后台 二、进入开发者工具,打开对应的小程序项目,复制底部小程序特定页面的路径 三、粘贴到对应位置的文本框,点击确定即可

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

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

django之drf框架(排序、过滤、分页、异常处理)

排序 排序的快速使用 1.必须是继承GenericAPIView及其子类才能是用排序 导入OrderingFilter类,from rest_framework.filters import OrderingFilter 2.在类中配置类属性 filter_backends[OrderingFilter] 3.类中写属性 ordering_fields [price,id] # 必须是表的…

某后台管理系统加密参数逆向分析

前言 在我们日常的渗透中经常会遇到开局一个登录框的情况,弱口令爆破当然是我们的首选。但是有的网站会对账号密码等登录信息进行加密处理,这一步不由得阻碍了很多人的脚步。前端的加解密是比较常见的,无论是 web 后台还是小程序&#xff0c…

k8s之部署kubeadm

master 20.0.0.71(4核8G) docker、kubelet、kubectl、kubeadm、flannel node1 20.0.0.73(最少2核4G) docker、kubelet、kubectl、kubeadm、flannel node2 20.0.0.74(最少2核4G) docker、kubelet、kube…

检查Excel内容是否符合规范

代码一: package com.ly.cloud.config;import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.f…

【MySQL库的操作】

1.库的操作 1.1 创建数据库 语法: create databases [IF NOT EXISTS] 数据库名;注意: [] 是可选项 1.2 创建数据库案例 创建名为 db1 的数据库 create databases db1;说明:当我们创建数据库没有指定字符集和校验规则时,系统…

docker compose 部署 grafana + loki + vector 监控kafka消息

Centos7 随笔记录记录 docker compose 统一管理 granfana loki vector 监控kafka 信息。 当然如果仅仅是想通过 Grafana 监控kafka,推荐使用 Grafana Prometheus 通过JMX监控kafka 目录 1. 目录结构 2. 前提已安装Docker-Compose 3. docker-compose 自定义服…

Go 泛型之泛型约束

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

Keras多分类鸢尾花DEMO

完整的一个小demo: pandas1.2.4 numpy1.19.2 python3.9.2 import numpy as np import pandas as pd import matplotlib.pyplot as plt from pandas import DataFrame from scipy.io import loadmat from sklearn.model_selection import train_test_split impor…