当前位置: 首页 > news >正文

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 
beginupdate sav1set 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 
beginupdate sav1set 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
beginupdate sav1set 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
begindelete 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
begininsert 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;

相关文章:

  • Hadoop架构、Hive相关知识点及Hive执行流程
  • 个人app编程的好处及条件
  • CSS知识点梳理(一)
  • element ui中Select 选择器,自定义显示内容
  • Word2Vec的缺点
  • 将 ONLYOFFICE 文档编辑器与 С# 群件平台集成
  • Python开源项目RestoreFormer(++)——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践
  • Debian 9 Stretch APT问题
  • 接口测试及常用接口测试工具
  • 前端小技巧: 数组reduce方法的五种常见用途
  • 矢量图形编辑软件Boxy SVG mac中文版软件特点
  • Python制作国旗头像
  • 深度学习之pytorch第一课
  • 烟草5G智慧工厂数字孪生可视化平台,赋能烟草工业数字化智慧转型
  • 30基于Feign远程调用
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Hibernate【inverse和cascade属性】知识要点
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • MySQL数据库运维之数据恢复
  • Octave 入门
  • 初探 Vue 生命周期和钩子函数
  • 如何解决微信端直接跳WAP端
  • 如何学习JavaEE,项目又该如何做?
  • 深度学习在携程攻略社区的应用
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • Semaphore
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (分享)自己整理的一些简单awk实用语句
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)库存超卖案例实战——优化redis分布式锁
  • (算法)N皇后问题
  • (学习日记)2024.01.19
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • *1 计算机基础和操作系统基础及几大协议
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net FrameWork简介,数组,枚举
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net操作Excel出错解决
  • .Net的C#语言取月份数值对应的MonthName值
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • ?.的用法
  • @FeignClient注解,fallback和fallbackFactory
  • [ linux ] linux 命令英文全称及解释
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Assignment] C++1