SQL触发器

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

在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;

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

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

相关文章

Google play提高上包率——如何防止封号、拒审、下架?

Google Play是全球最大的移动应用商店之一,它是运行Android操作系统的设备的官方应用商店。它提供各种数字内容,包括应用程序(应用)、游戏、音乐、书籍等,包括免费和付费选项。这也为许多游戏/APP出海的企业或开发者提…

国内首批!华为云云原生中间件DCSDMS获软件可信“卓越级”认证

11月6日,在软件供应链可信研讨大会上,工业和信息化部电子第五研究所(以下简称“电子五所”)发布了首批软件产品可信评估结果,并为通过评估的企业颁发证书。 华为云作为中国领先的综合云计算服务商受邀参加本次大会&…

【星海随笔】git的使用

1.在终端,检查git是否安装 git --version 2.没有安装的话去,官网,下载git 3.一直点下一步即可 4.安装后在终端检查git是否安装好 5.设置用户名和邮件地址(最好和GitHub的用户名/邮箱保持一致) git config --global user.name “自己的用户名”…

建表时如何合理选择字段类型

前言 我们在建表的时候关于字段类型的选择会有这么几类人: 严谨型 严格调研每个字段可能的大小,然后根据不同字段类型的限制,进行选择,这一类人在创建关系型数据表的时候是没有问题的。图自己省事型 把所有字段都设置为String&a…

100 寻找重复数

寻找重复数 题解1 二分法题解2 快慢指针(同环形链表2(ab)(ab)kL) 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返…

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码,所以对于python语言中的常见数据结构的用法也不是很熟悉,对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的,属性都是自己定义&a…

动态规划-构建乘积数组

** 描述 给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B 的元素 B[i]A[0]A[1]…*A[i-1]A[i1]…*A[n-1](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] A[1] * A[2] * … * A[n-1…

量子计算和量子通信技术:引领潜力无限的未来

近年来,随着量子计算和量子通信技术的迅速发展,它们在各个领域的广泛应用前景引起了人们的极大兴趣。本文将深入探讨量子计算和量子通信技术的普遍应用,以及它们预示的未来,同时提出业内人士需要注意的事项。 介绍:量子…

【Spring之底层核心架构概念解析】

文章目录 一、BeanDefinition二、BeanDefinitionReader2.1、AnnotatedBeanDefinitionReader2.2、XmlBeanDefinitionReader 五、ClassPathBeanDefinitionScanner六、BeanFactory七、ApplicationContext7.1、AnnotationConfigApplicationContext7.2、ClassPathXmlApplicationCont…

E云管家个微协议框架--新版本的利器

在互联网时代,高效、可靠的互联网协议对于实现稳定、安全的数据传输至关重要。E云管家作为一项创新性的IPAD协议构建工具,基于IPAD8.0.37协议为开发者提供了强大而灵活的功能,使他们能够轻松构建高效的通信协议。本文将介绍E云管家的主要特点…

python3.8及以上版本绑定gdal库的一个注意事项

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> gdal和python绑定参考文章:windows环境下python和gdal绑定方法   值得注意的是绑定python3.8及以上版本后在python程序中初始化gdal库时会出…

“三门问题”解决方案:换不换?更换策略与贝叶斯策略?附 Java 验证代码

文章目录 前言一、什么是“三门问题”?二、“三门问题”解决策略详解2.1、错误策略:直觉策略与随机策略2.2、更换策略与事件分析计算2.3、贝叶斯策略及分析流程 三、Java 语言验证“三门问题”总结 前言 “三门问题”作为一道经典逻辑推理题,…

【Linux】Linux常用命令—用户管理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

《QT从基础到进阶·二十》QThreadPool线程池的使用

什么情况下比较适合用线程池&#xff1f; 比如我有上百个任务要同时处理&#xff0c;难道开上百个线程&#xff1f;NO&#xff01;&#xff01;&#xff01; 有了线程池的加持&#xff0c;自动给任务分配线程处理&#xff0c; 多线程不再是真爱~ 线程池创建&#xff1a; 1、自…

【带头学C++】----- 四、动态内存空间申请 ---- 4.1 动态内存分配

1.动态内存分配概述 在C和C等语言中&#xff0c;可以使用malloc、calloc、realloc或使用new等函数来动态分配内存空间&#xff0c;同时使用free、delete函数释放动态分配的内存空间&#xff0c;这样可以根据程序的实际需要动态管理内存&#xff0c;避免静态内存分配的局限性。 …

微信超实用的小功能

微信真的有超多实用小功能 平时很少注意到&#xff0c;每次都用传统的方法解决&#xff0c;浪费人家研发人员的一片苦心~ 1重要事项提醒&#xff1a;健忘症的福音&#xff1b; 步骤&#xff1a;长按消息-提醒-设置。 2 图片翻译&#xff1a;不用跳转翻译软件&#xff0c;一键翻…

什么是自动化测试框架?我们该如何搭建自动化测试框架?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

数据分析-numpy

numpy numpy numpy简介优点下载ndarray的属性输出数据类型routines 函数ndarray对象的读写操作ndarray的级联和切分级联切分 ndarray的基本运算广播机制&#xff08;Broadcast&#xff09;ndarry的聚合操作数组元素的操作numpy 数学函数numpy 查找和排序 写在最后面 简介 nump…

js 变量声明与赋值 笔试踩坑题

文章目录 概述函数声明函数形参与实参函数预编译用一个例子说明一下&#xff0c;这四个步骤分别要干些什么。重复四个步骤&#xff0c;反复练习一下 全局编译多重执行期上下文 概述 别小看变量声明与赋值&#xff0c;在所有的笔试中&#xff0c;基本都会考&#xff0c;这个要多…

LeetCode刷题总结(一)

文章目录 前言题型排序问题动态规划 前言 本文把刷题过程中的总结记下来&#xff0c;方便未来回顾的时候继续拓展。 题型 排序问题 排序问题的解决方法有很多。对于简单算法来说&#xff0c;最重要的是记住思路&#xff1b;对于高级算法来说&#xff0c;最重要的是记住细节…