SQL触发器

news2024/11/25 21:42:16

触发器是与表有关的数据库对象。

在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发
器中定义的SQL语句集合。

触发器的这种特性可以协助应用在数据库端确保数据的完整性, 日志记录 , 数据校验等操作 。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。
在这里插入图片描述

CREATE TABLE employee(
	employee_ID int not null,
	employee_name varchar(20) not null,
	street varchar(20) not null,
	city varchar(20) not null,
	PRIMARY KEY(employee_ID)
);

create table works(
	employee_ID int not null,
	company_name varchar(30),
	salary numeric(8,2) check (salary>3000),  
	primary key(employee_ID),
	foreign key(employee_ID) references employee(employee_ID) on delete cascade,
	foreign key(company_name) references company(company_name) on delete set null									
);

create table sav1(
	company_name varchar(30) not null,
	avg_salary numeric(8,2) check (avg_salary>3000),
	primary key(company_name)
);

create table myevent(
	employee_ID int not null,
	employee_name varchar(20) not null,
	salary numeric(8,2)
);

1.在表SAV1上定义一个update触发器trig_update。当修改某个员工的工资后,自动重新计算每个公司的平均工资,并更新到SAV1表中。

create trigger trig_update 
after update on works for each row 
begin
	update sav1
	set sav1.avg_salary=(
		select avg(works.salary) 
		from works 
		where works.company_name=new.company_name)
	where sav1.company_name=new.company_name;
end;

2.在表SAV1上定义一个insert触发器trig_insert。当插入一个员工的工资后,自动重新计算每个公司的平均工资,并更新到SAV1表中。

create trigger trig_insert 
after insert on works for each row 
begin
	update sav1
	set sav1.avg_salary=(
		select avg(works.salary) 
		from works 
		where works.company_name=new.company_name)
	where sav1.company_name=new.company_name;
end;

3.在表SAV1上定义一个delete触发器trig_delete。当删除一个员工的工资后,自动重新计算每个公司的平均工资,并更新到SAV1表中。

# MYSQL5.0触发程序不会被级联的外键动作激活,Oracle,DB2,SQL Server都支持
create trigger trig_delete 
after delete on works for each row
begin
	update sav1
	set sav1.avg_salary=(
		select avg(works.salary) 
		from works 
		where works.company_name=old.company_name)
	where sav1.company_name=old.company_name;
end;

直接在employee表中删除‘MrDeng’的员工的信息,因为有外键约束,works表中相关信息也会被删除。

delete from employee where employee_name='MrDeng';  

mysql 5.* 版本在级联删除时不会执行delete触发器,比如 A、B 两个表,A 是主键表,B 是外键表,级联删除。那么 A 表中的记录被删除时,B 表中对应的记录也将被自动删除,如果 B 表中有针对 DELETE 的触发器,这个触发器不会被执行。
Oracle,DB2,SQL Server都支持级联删除。
解决办法:在A表中创建一个触发器间接触发B的触发器。

create trigger temp_trig_delete 
before delete on employee for each row
begin
	delete from works where works.employee_ID=old.employee_ID;
end;

4.创建一个update_salary的触发器,每次向works表更新数据之后都会向名称为myevent的数据表中插入一条记录,其中myevent表包含三个属性:employee_ID,employee_name和 salary。

create trigger update_salary
after insert on works for each row
begin
	insert into myevent(employee_ID,employee_name,salary) values (new.employee_ID,(select employee_name from employee where employee.employee_ID=new.employee_ID),new.salary);
end;

5.删除触发器trig_update。

drop trigger trig_update;

6.查看触发器的信息。

show triggers;

select * from information_schema.triggers;

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

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

相关文章

linux系统中查看防火墙开放的端口状态 开放端口和禁用端口号操作命令

一、查看防火墙状态 查看防火墙状态:systemctl status firewalld 开启防火墙:systemctl start firewalld 关闭防火墙:systemctl stop firewalld 若遇到无法开启 先用:systemctl unmask firewalld.service 然后:s…

1.3数据结构之复杂度 力扣题目移除元素

移除元素首先我们可能会想到内存的释放,但是内存的释放是一次性的,不能断断续续,所以不能直接free掉。 思路1:时间复杂度是:O(n) 空间复杂度是:O(n) 思路2:时间复杂度:O(n) 空间复…

TortoiseSVN 状态图标不显示的两种解决办法

文章目录 TortoiseSVN 方式解决注册表方式解决 TortoiseSVN 方式解决 在桌面或者资源管理器中鼠标右键打开 TortoiseSVN 设置选择 Icon Overlays (图标覆盖)Status cache(状态缓存) 选择 ‘Shell’ 选择 Icon Overlays(图标覆盖)…

在软件测试过程中如何有效的开展接口自动化测试!

一.简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中,通过对接口的自动化测试来提高测试效率和测试质量,减少人工测试的工作量和测试成本,并且能够快速发现和修复接口错误&…

ARMday04(开发版简介、LED点灯)

开发版简介 开发板为stm32MP157AAA,附加一个拓展版 硬件相关基础知识 PCB PCB( Printed Circuit Board),中文名称为印制电路板,又称印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子…

JVM虚拟机-虚拟机性能监控、故障处理工具

1基础故障处理工具 jps(JVM Process Status Tool)是:虚拟机进程状况工具 作用:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进…

人工智能数学基础3:用Python 编程求极限

求极限,并用Python 编程求极限 使用洛必达法则来求解 利用泰勒展开的方法来求解这个极限 import sympyx sympy.Symbol(x) f (sympy.sin(x) - x * sympy.cos(x)) / (sympy.sin(x) ** 3)limit_value sympy.limit(f, x, 0) print(limit_value)

【QT】qt打包程序后无法正常启动

本人在自己电脑上打包Qt程序后可以正常运行,但换了个电脑就无法运行了,显示应用程序无法正常启动(0xc000007b)。 造成这种情况的原因是因为系统变量的原因,我用的win10自带的cmd。 应该采用Qt自带的cmd,打开…

人工智能基础——python:Pandas与数据处理

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

四入进博会,优衣库围绕科技可持续演绎“服装进化论”

11月5日,第六届中国国际进口博览会在上海拉开帷幕。这些年来,进博巨大的平台效应,使其成为各个行业头部品牌的秀场,也持续为消费者、产业链带来惊喜。 今年,也是全球服装界科技知名品牌——优衣库的第四次进博之旅。从…

OpenCV校准棋盘集合

棋盘格可以与相机校准工具一起使用,例如ROS的camera_calibration包。您可以通过单击下面的任何链接免费下载 PDF 格式的各种棋盘,没有水印或广告。此外,还添加了基于 JavaScript 的棋盘生成器,允许您生成自定义尺寸。 提示&#…

《持续交付:发布可靠软件的系统方法》- 读书笔记(十三)

持续交付:发布可靠软件的系统方法(十三) 第 13 章 组件和依赖管理13.1 引言13.2 保持应用程序可发布13.2.1 将新功能隐蔽起来,直到它完成为止13.2.2 所有修改都是增量式的13.2.3 通过抽象来模拟分支 13.3 依赖13.3.1 依赖地狱13.3…

AlphaControls控件TsRadioGroup的使用

通常使用AlphaControls控件中的TsRadioGroup时,往往使用默认值,会造成TsRadioGroup标题被TsRadioGroup的ITEMs占用,严重影响美观: 解决方案,通过对TsRadioGroup的ContentVOffset属性,设置为10。即可立即改善…

计算机网络实验

计算机网络实验 使用软件PT7.0按照上面的拓扑结构建立网络,进行合理配置,使得所有计算机之间能够互相通信。并且修改各交换机的系统名称为:学号_编号,如你的学号为123,交换机Switch0的编号为0,则系统名称为…

linuxC语言缓冲区及小程序的实现

文章目录 1.文件缓冲区1.1介绍1.2缓冲文件系统1.3冲刷函数fflush1.4认识linux下的缓冲区 2.linux小程序的实现2.1 回车\r和换行\n2.2倒计时程序2.3进度条小程序sleep/usleep代码运行结果 1.文件缓冲区 1.1介绍 为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以…

matlab命令行窗口结果显示不全,解析式太长,输出不完整解决办法

一、背景 在运行matlab程序时,有时输出结果太长,命令行窗口无论怎么拉大都显示不全,复制结果也是会有…,而不是完整结果,如下图所示: 双击复制结果显示如下: y: (25exp(-8x)(10exp(8x) - 9))/…

归并分治 笔记

归并分治 前置知识:讲解021-归并排序 原理: (1)思考一个问题在大范围上的答案,是否等于,左部分的答案 右部分的答案 跨越左右产生的答案(2)计算“跨越左右产生的答案”时,如果加上左、右各自…

ros1 基础学习09 -自定义service服务开发示例

自定义service服务开发示例 如何使用服务一、模型图二、创建功能包三、自定义服务数据3.1 在package.xml中添加功能包依赖3.2 在CmakeLists.txt中添加编译选项3.3 编译生成的C文件和Python库4.1.2 编译整个工作空间 测试: 在ROS中,除了消息这种通信类型外…

云数据安全:在数字时代保护您的宝贵资产

在数字化时代,云计算已经成为企业和个人数据存储和处理的主要方式。然而,与之相伴而来的是日益严峻的数据安全挑战。本文将探讨云数据安全的重要性以及如何在云环境中保护您的数据。 一、云计算的崭新时代 云计算为组织提供了无与伦比的灵活性和效率&…

LinkedList的插入速度一定比ArrayList快吗?

目录 一、有一道经典的面试题,“ArrayList 和 LinkedList 的区别是什么?”1、小白答法:2、入门答法:3、系统回答 二、LinkedList的插入速度一定比ArrayList快吗?三、分析一下两种数据结构的add源码1、先分析熟悉的Arra…