第14章:触发器概述

news2025/2/24 7:30:26

一、触发器概述

1.开发场景

有2个相互关联的表,商品信息库存信息表。在添加一条新商品记录时,为了保证数据完整性,在库存表添加一条库存记录。

把两个关联操作步骤写到程序里面,用事务包裹起来,确保两个操作成为一个原子操作,要么全部执行,要么全部不执行。

除了事务,还可以创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作。

2.触发器概述

触发器是由事件来触发某个操作,这些事件包括insert,update,delete事件。所谓事件是用户的动作或者触发某项行为。如果定义触发程序,当数据库执行这些语句时候,就相当于事件发生了。就会自动激发触发器执行相应的操作。

3.触发器的创建

说明

表名:表示触发器监控的对象

before|after:表示触发的时间,before在事件之前触发,after在事件之后触发。

insert|update|delete:表示触发的事件

4.代码实现

准备

create table test_trigger(
id int primary key auto_increment,
t_note varchar(30)
);

create table test_trigger_log(
id int primary key auto_increment,
t_log varchar(30)
);

创建触发器1

创建名称为before_insert的触发器,向test_trigger数据表插入数据之前,向test_trigger_log数据表中插入before_insert的日志信息。

delimiter $
create trigger before_insert
before insert on test_trigger
for each row 
begin
insert into test_trigger_log(t_log)
values ('before_insert');
end $
delimiter ;

测试

insert into test_trigger(t_node)
values
('测试数据1')

创建触发器2

创建名称为after_insert的触发器,向test_trigger数据表插入数据之后,向test_trigger_log数据表中插入after_insert的日志信息。

delimiter $
create trigger after_insert
after insert on test_trigger
for each row
begin 
insert into test_trigger_log(t_log)
values('after_insert');
end $
delimiter ;

测试

insert into test_trigger(t_node)
values
('测试数据2')

创建触发器3

定义触发器“salary_check_trigger”,基于员工表“employees”的INSERT事件,在INSERT之前检查将要添加的新员工薪资是否大于他领导的薪资,如果大于领导薪资,则报sqlstate_value为'HY000'的错误,从而使得添加失败。

delimiter $
create trigger salary_check_trigger
before insert on emp
for each row 
begin
# 查看数据的manager的薪资
declare mgr_sal double; 
select salary into mgr_sal from employees 
where employee_id = new.manager_id;
# 判断
if new.salary > mgr_sal
then signal sqlstate 'HY000' set message_text='错误薪资不能高于领导薪资';
end if;
end $
delimiter ;

二、查看、删除触发器

1.查看当前数据的所有触发器

show triggers

2.查看创建触发器的定义

show create trigger 触发器名称

3.从系统库里面查询触发器的信息

SELECT * FROM information_schema.TRIGGERS;

4.删除触发器

drop trigger 触发器名称;

三、触发器的优缺点

1.触发器优点

①触发器可以确保数据的完整性

②触发器可以记录操作日志

③触发器在操作数据前,对数据的合法性进行检查

2.触发器缺点

①触发器的可读性差

②数据表结构的变更,触发器出错

四、触发器的练习

#0. 准备工作

CREATE TABLE emps 
AS 
SELECT employee_id,last_name,salary 
FROM atguigudb.`employees`; 

#1. 复制一张emps表的空表emps_back,只有表结构,不包含任何数据

create table emps_back
as 
select * from atguigudb.employees
where 0

#2. 查询emps_back表中的数据

select * from emps_back

#3. 创建触发器emps_insert_trigger,每当向emps表中添加一条记录时,同步将这条记录添加到emps_back表中

delimiter $
create trigger emps_insert_trigger
after insert on emps
for each row 
begin 
insert into emps_back(employee_id,last_name,salary)
values(new.employee_id,new.last_name,new.salary);
end $
delimiter ;

#4. 验证触发器是否起作用

insert into  emps
values
(101,'wang',8000)

#5.创建触发器emps_del_trigger,每当向emps表中删除一条记录时,同步将删除的这条记录添加到 emps_back1表中,验证触发器是否起作用

delimiter $
create trigger emps_del_trigger
before delete on emps
for each row 
begin
insert into emps_back(employee_id,last_name,salary)
values(OLD.employee_id,OLD.last_name,OLD.salary);
end $
delimiter ;

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

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

相关文章

Qt6之默认取消MySQL支持?

说明:本篇不是讨论qt怎么使用MySQL,这类的文章一搜一大堆。 一、结论 Qt6开始确实默认取消了对MySQL的支持,用户需自行编译生成MySQL的驱动DLL库。 首先不是qt增加使用门槛是风向变了,而是自从Oracle 收购MySQL后对其进行了商业化…

LC-1377. T 秒后青蛙的位置(DFS、BFS)

1377. T 秒后青蛙的位置 难度困难57 给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下: 在一秒内,青蛙从它所在的当前顶点跳到另一个 未访问 过的顶点(如果它们直接相连)。青…

一键呼叫可视对讲用于路灯杆

城市建设进入新时代,各种智慧化设施应运而生。路灯杆一键呼叫可视对讲系统可以实现智能安防、信息传递等多种功能,成为城市智慧化的重要组成部分。 1. 系统介绍 路灯杆一键呼叫可视对讲系统由路灯杆、摄像头、语音呼叫器等组成。当市民需要求助或报警时…

大数据开发之Hive案例篇5- count(distinct) 优化一例

文章目录 一. 问题描述二. 解决方案2.1 调整reduce个数2.2 SQL改写 一. 问题描述 需求: 卡在了reduce,只有一个reduce MR job卡在了最后一个reduce,任务迟迟未运行成功 二. 解决方案 2.1 调整reduce个数 一般一个reduce处理的数据是1G&#xff0c…

【Dubbo核心 详解四】Dubbo服务提供者的详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Dubbo核心详解(附代码示例) 文章目录 引言一、服务提供者1.1 服务提供者介绍Dubbo 服务提供者启…

NPDP|产品经理的硬实力体现在哪里?

在企业里,产品经理是一个具有综合职能的职位,其工作的范围可以说已经遍及到了公司的每个角落其接触的人员也涉及公司几乎所有的部门。 产品经理是产品品牌塑造者、更是营销骨干,是一套完善的营销运作制度,更是博大精深的营销操作…

git clone 报错10054,解决方法

使用git clone下载工程时,报错提示如下: fatal: unable to access https://github.com/deozhang/GaoZhongShuXue.git/: OpenSSL SSL_read: Connection was reset, errno 10054 报错提示的代码是10054,根据提示和网上搜索结果,可以…

Ae:跟踪运动

使用跟踪器 Tracker面板的跟踪运动 Track Motion功能,可通过手动添加和设置跟踪点来跟踪对象的运动,并能将获得的跟踪数据应用于其它对象。 Ae菜单:窗口/跟踪器 Tracker 点击跟踪器面板上的“跟踪运动”按钮,会为图层添加“动态跟…

Charles使用教程【简易版】

Charles抓包教程 1、电脑安装charles 2、电脑打开charles后安装root证书 3、电脑信任证书 4、手机连接与电脑同一wifi 5、设置手机代理 wlan设置中将当前 wifi 的代理改成手动,主机名填电脑 ip,端口填8888 此时如果当前手机是第一次被你的电脑设备代理或…

【JavaSE】Java基础语法(四)

文章目录 🍼1. 循环细节🥢1.1 循环语句-dowhile循环🥢1.2 三种循环的区别🥢1.3 跳转控制语句 🍼2. Random🥢2.1 Random产生随机数🥢2.2 Random练习-猜数字 🍼1. 循环细节 &#x1f…

[资料分享]基于单片机防酒驾酒精检测报警系统装置设计、基于数字电路演讲计时protues仿真设计

基于单片机防酒驾酒精检测报警系统装置设计 一、说明 通过MQ3传感器检测酒精浓度,信号由ADCO832进行处理模数转化再到单片机进行处理,当检测到浓度超过“酒驾”报警值时,红灯亮起,当检测到浓度超过“醉驾”报警值时,…

网关网卡配置

Vmvare虚拟机设置外网IP 查看当前主机的网卡名/当前IP/子网掩码,网关地址 ifconfig route -n 查看DNS nslookup hcos 网卡名称为enp0s3,IP地址为10.0.2.15,子网掩码为255.255.255.0,网关为10.0.2.2; Centos设置IP/网…

【Java编程系列】gateway限流实践时发生的问题和解决方案

前期回顾: 【Java编程系列】Springcloud-gateway自带限流方案实践篇 1、实践中发生的问题 主要有以下几个问题: 1、限流返回的响应数据无法自定义 (LogFormatUtils.java:91) - [7b93af46-20] Completed 429 TOO_MANY_REQUESTS 返回后显示的情况如下&a…

C++第二章:变量和基本内置类型

变量和基本内置类型 一、基本内置类型1.1 算数类型1.2 带符号类型和无符号类型1.3 类型转换含有无符号类型的表达式 1.4 字面值常量整形和浮点型字面值字符和字符串字面值转义序列指定字面值的类型 二、变量2.1 变量的定义初始化列表初始化默认初始化 2.2 变量声明和定义的关系…

【web-ctf】ctf_BUUCTF_web(2)

文章目录 BUUCTF_webSQL注入1. [RCTF2015]EasySQL2. [CISCN2019 华北赛区 Day1 Web5]CyberPunk3. [CISCN2019 总决赛 Day2 Web1]Easyweb4. [GYCTF2020]Ezsqli5. [网鼎杯 2018]Comment 文件上传漏洞1. [WUSTCTF2020]CV Maker2. [NPUCTF2020]ezinclude3. [SUCTF 2019]EasyWeb 文件…

TADK 23.03 release note

主要功能概述: 基于深度学习的应用分类:在原有的基于机器学习的应用分类(AppID)能力基础上,扩展出新的深度学习参考模型和推理引擎。FFEL的raw byte特征提取:增加了流特征提取库(FFEL)对数据包中的raw byte特征提取能力&#xff0…

Meta AI 重磅推出LIMA!媲美GPT-4、无需RLHF就能对齐!

深度学习自然语言处理 原创作者:鸽鸽 昨天Meta AICMU这篇文章一出,twitter都炸了! LIMA,只使用1000个精心挑选的样本微调一个 65B LLaMa,无需RLHF,性能媲美甚至优于GPT-4! 论文:LIMA…

游戏洞察丨自来水还是井水,后流量时代的私域挑战

流量生意本质上是买卖用户浏览时间的生意,如果用户增长到顶,那就意味着供给到顶。对比 2021 年,2022 年的游戏出海在谷歌和 Facebook 上投入的广告成本几乎翻了一倍。新晋“渠道王者”TikTok 逐渐走进大家的视野。该现象背后的原因在于&#…

解决幂等问题,只需要记住这个口诀!

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 417 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 作为开发人员,我们每天都要开发大量的接口,其中包括了读接口和写接口,而对于写接…

将矩阵按指定对角线转化为一个上三角矩阵numpy.triu()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将矩阵按指定对角线转化为一个上三角矩阵 numpy.triu() 选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([[1,2],[3,4]]) print("【显示】a\n",a) print(&…