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

数据库实践LAB大纲 04 触发器

游标

系统为用户开设的一个数据缓冲区 —— 存T-SQL语句从数据库检索出来的结果集

对结果集处理:结果集一条条提取记录,这时要用游标

使用

  • 利用基于变量的select into语句,只能处理单条记录
  • 使用游标循环处理
  1. 声明游标: DECLARE cursor_name CURSOR FOR select_statement
  2. 打开游标 :OPEN cursor_name
  3. 使用游标 :FETCH cursor_name INTO var_name [, var_name] …
  4. 关闭游标 :CLOSE cursor_name

顺序

  1. 游标声明在处理程序之前,在变量和条件之后
  2. select 语句 不能出现INTO语句

特性

  • 允许应用程序对 查询语句 select 返回结果集“某一行”进行操作,rather than一次对整体做同一个操作
  • 只读: 不可能新基础表数据
  • 不可滚动:按确定顺序获取行,不能以相反顺序获取,不可跳行
  • 敏感: 敏感游标指向实际数据(类似指针,引用),不敏感游标使用临时副本(类似传参)
    • 前者比后者更快,因为不需要copy临时数据
    • 但其他数据做的更改会影响前者的数据。
create procedure qq_cursor_insert()
begindeclare a varchar(15);declare b int;declare cur1 cursor for select qqno, tid from qq;declare exit handler for not found close cur1;open cur1;repeatfetch cur1 into a, b;insert into new_qq(a, b) values(a, b);until 0end repeatl;close cur1;
end;

触发器

定义了一系列操作,这一系列操作称为触发程序,当触发事件发生时,触发程序会自动运行

主要监视以下情况

  1. insert
  2. update
  3. delete

行驶时间可设置为

  1. before
  2. after

特点

  1. 安全性:使users具有操作数据库的某种权利,比如基于时间限制,规定时间外不能修改;比如基于数据限制,不允许分数为负数
  2. 审计: 跟踪user对数据库的操作
  3. 复杂的数据完整性规则: 完整性检查和约束,如触发器可回退 任何企图吃进超过自己保证金的期货
  4. 复杂的非标准的数据库相关完整性规则: cascade 修改 或删除匹配行/设置null或default/拒绝、回退破坏相关完整性的变化

创建

触发程序是与表有关的命名数据库对象,创建后该对象在MySQL中

语法

create trigger trigger_name trigger_time trigger_event
on tbl_name for each row trigger_stmt
  • trigger_name: 名字,唯一名称
  • trigger_time :触发器被触发的时间 BEFORE(验证新数据是否满足使用的限制) | AFTER(激活触发器的语句执行之后完成几个或更多的改变)
  • trigger_event : 激活触发器的语句的类型
  • tbl_name:与触发器相关联的表名,不能为TEMPORARY表或VIEW(同一个表不能拥有两个具有相同触发时刻和事件的触发器,可能其他版本会有差异)
  • for each row:用来指定对于受触发事件影响的每一行都要激活触发器的动作
  • trigger_stmt:是当触发程序激活时执行的语句。 多个语句用 BEGIN END结构

example – 限制某些字段在 60, 150, 230内

delimiter $$
create trigger course_insert_before_trigger before insert
beginif(new.up_limit = 60 || new.up_limit = 150 )then set new.up_limit = new.up_limit;else insert into mytable values(0); -- 注意 mytable并不存在于数据库中--原理是创造一个error终止这次insertend if
end;
delimiter ;

OLD和NEW访问受trigger影响的字段值

  1. INSERT 只能用 NEW
  2. DELETE 只能用 OLD
  3. UPDATE, 可以用OLD引用更新前的值,也可能用 NEW引用更新后的值
  • OLD只读,不可改

example – update触发器限制某些字段在 60, 150, 230内

delimiter $$
create trigger course_update_before_trigger before update
on course for each row 
beginif(new.up_limit!=60||new.up_limit!=150||new.up_limit!=230) then set new.up_limit=old.up_limit;
end if;
end;
$$
delimiter ;

查看触发器

  1. show triggers 查看当前数据库中所有触发器的信息
  2. select *from information_schema.triggers
    触发器的定义都存放在information_schema数据库下的triggers表中
  3. show create trigger 检查特定触发器定义
  4. 创建触发器后,MySQL自动在数据库目标下创建TRN以及TRG触发器文件,可以自行打开

删除触发器

drop trigger [schema_name.]trigger_name
  1. schema_name.:可选项 指定数据库
  2. trigger_name 触发器
  3. drop trigger要super权限
  4. 删除一个表的同时,也会自动删除表上的触发器,trigger不可更新覆盖

注意事项

创建

  1. trigger内部select语句不能返回结果集
  2. 同一个表不能创建两个相同触发时间、触发事件的触发程序(5.7.2版本之后可以)
  3. 不可使用事务相关语句
  • start transaction
  • commit
  • rollback
  • set autocommit=0
  1. MySQL触发器针对记录进行操作,当批量更新数据时,引入触发器会导致批量更新操作的性能降低

引擎执行的过程

  1. MySQL存储引擎 MyISAM中, trigger不能保证原子性
  • 更新表的同时,trigger实现另一个表的更新,若trigger程序失败了,不会回滚这次更新前一个表的操作。
  • InnoDB引擎支持十五,trigger保持更新操作和trigger操作的原子性 —— 把他们视为同一个transaction
  1. InnoDB存储引擎实现外键约束关系时,建议使用级联选项维护外键数据 —— 先维护 子表数据,再维护父表

触发器的使用过程

  1. trigger内部不能使用update(用set代替)
  2. before处罚程序中:auto_increament字段的new值为0 instead of 实际插入新纪录时自动生成的自增型字段值

例子

  1. 维护冗余数据 —— 避免数据不一致问题的发生
  2. 模拟外键级联选项
  • 对于InnoDB存储引擎的表而言,由于支持外键约束,在定义外键约束时,通过设置外键的级联选项cascade、set null或者no action(restrict),外键约束关系可以交由InnoDB存储引擎自动维护
  • 如果InnoDB存储引擎的表之间存在外键约束关系,但是不存在级联选项或者使用数据库表为MyISAM(该表不支持外键约束关系),则可以使用触发器模拟实现“外键约束”之间的“级联选项

游标

系统为用户开设的一个数据缓冲区 —— 存T-SQL语句从数据库检索出来的结果集

对结果集处理:结果集一条条提取记录,这时要用游标

使用

  • 利用基于变量的select into语句,只能处理单条记录
  • 使用游标循环处理
  1. 声明游标: DECLARE cursor_name CURSOR FOR select_statement
  2. 打开游标 :OPEN cursor_name
  3. 使用游标 :FETCH cursor_name INTO var_name [, var_name] …
  4. 关闭游标 :CLOSE cursor_name

顺序

  1. 游标声明在处理程序之前,在变量和条件之后
  2. select 语句 不能出现INTO语句

特性

  • 允许应用程序对 查询语句 select 返回结果集“某一行”进行操作,rather than一次对整体做同一个操作
  • 只读: 不可能新基础表数据
  • 不可滚动:按确定顺序获取行,不能以相反顺序获取,不可跳行
  • 敏感: 敏感游标指向实际数据(类似指针,引用),不敏感游标使用临时副本(类似传参)
    • 前者比后者更快,因为不需要copy临时数据
    • 但其他数据做的更改会影响前者的数据。
create procedure qq_cursor_insert()
begindeclare a varchar(15);declare b int;declare cur1 cursor for select qqno, tid from qq;declare exit handler for not found close cur1;open cur1;repeatfetch cur1 into a, b;insert into new_qq(a, b) values(a, b);until 0end repeatl;close cur1;
end;

触发器

定义了一系列操作,这一系列操作称为触发程序,当触发事件发生时,触发程序会自动运行

主要监视以下情况

  1. insert
  2. update
  3. delete

行驶时间可设置为

  1. before
  2. after

特点

  1. 安全性:使users具有操作数据库的某种权利,比如基于时间限制,规定时间外不能修改;比如基于数据限制,不允许分数为负数
  2. 审计: 跟踪user对数据库的操作
  3. 复杂的数据完整性规则: 完整性检查和约束,如触发器可回退 任何企图吃进超过自己保证金的期货
  4. 复杂的非标准的数据库相关完整性规则: cascade 修改 或删除匹配行/设置null或default/拒绝、回退破坏相关完整性的变化

创建

触发程序是与表有关的命名数据库对象,创建后该对象在MySQL中

语法

create trigger trigger_name trigger_time trigger_event
on tbl_name for each row trigger_stmt
  • trigger_name: 名字,唯一名称
  • trigger_time :触发器被触发的时间 BEFORE(验证新数据是否满足使用的限制) | AFTER(激活触发器的语句执行之后完成几个或更多的改变)
  • trigger_event : 激活触发器的语句的类型
  • tbl_name:与触发器相关联的表名,不能为TEMPORARY表或VIEW(同一个表不能拥有两个具有相同触发时刻和事件的触发器,可能其他版本会有差异)
  • for each row:用来指定对于受触发事件影响的每一行都要激活触发器的动作
  • trigger_stmt:是当触发程序激活时执行的语句。 多个语句用 BEGIN END结构

example – 限制某些字段在 60, 150, 230内

delimiter $$
create trigger course_insert_before_trigger before insert
beginif(new.up_limit = 60 || new.up_limit = 150 )then set new.up_limit = new.up_limit;else insert into mytable values(0); -- 注意 mytable并不存在于数据库中--原理是创造一个error终止这次insertend if
end;
delimiter ;

OLD和NEW访问受trigger影响的字段值

  1. INSERT 只能用 NEW
  2. DELETE 只能用 OLD
  3. UPDATE, 可以用OLD引用更新前的值,也可能用 NEW引用更新后的值
  • OLD只读,不可改

example – update触发器限制某些字段在 60, 150, 230内

delimiter $$
create trigger course_update_before_trigger before update
on course for each row 
beginif(new.up_limit!=60||new.up_limit!=150||new.up_limit!=230) then set new.up_limit=old.up_limit;
end if;
end;
$$
delimiter ;

查看触发器

  1. show triggers 查看当前数据库中所有触发器的信息
  2. select *from information_schema.triggers
    触发器的定义都存放在information_schema数据库下的triggers表中
  3. show create trigger 检查特定触发器定义
  4. 创建触发器后,MySQL自动在数据库目标下创建TRN以及TRG触发器文件,可以自行打开

删除触发器

drop trigger [schema_name.]trigger_name
  1. schema_name.:可选项 指定数据库
  2. trigger_name 触发器
  3. drop trigger要super权限
  4. 删除一个表的同时,也会自动删除表上的触发器,trigger不可更新覆盖

注意事项

创建

  1. trigger内部select语句不能返回结果集
  2. 同一个表不能创建两个相同触发时间、触发事件的触发程序(5.7.2版本之后可以)
  3. 不可使用事务相关语句
  • start transaction
  • commit
  • rollback
  • set autocommit=0
  1. MySQL触发器针对记录进行操作,当批量更新数据时,引入触发器会导致批量更新操作的性能降低

引擎执行的过程

  1. MySQL存储引擎 MyISAM中, trigger不能保证原子性
  • 更新表的同时,trigger实现另一个表的更新,若trigger程序失败了,不会回滚这次更新前一个表的操作。
  • InnoDB引擎支持十五,trigger保持更新操作和trigger操作的原子性 —— 把他们视为同一个transaction
  1. InnoDB存储引擎实现外键约束关系时,建议使用级联选项维护外键数据 —— 先维护 子表数据,再维护父表

触发器的使用过程

  1. trigger内部不能使用update(用set代替)
  2. before处罚程序中:auto_increament字段的new值为0 instead of 实际插入新纪录时自动生成的自增型字段值

例子

  1. 维护冗余数据 —— 避免数据不一致问题的发生
  2. 模拟外键级联选项
  • 对于InnoDB存储引擎的表而言,由于支持外键约束,在定义外键约束时,通过设置外键的级联选项cascade、set null或者no action(restrict),外键约束关系可以交由InnoDB存储引擎自动维护
  • 如果InnoDB存储引擎的表之间存在外键约束关系,但是不存在级联选项或者使用数据库表为MyISAM(该表不支持外键约束关系),则可以使用触发器模拟实现“外键约束”之间的“级联选项

相关文章:

数据库实践LAB大纲 04 触发器

游标 系统为用户开设的一个数据缓冲区 —— 存T-SQL语句从数据库检索出来的结果集 对结果集处理:结果集一条条提取记录,这时要用游标 使用 利用基于变量的select into语句,只能处理单条记录使用游标循环处理 声明游标: DECLA…...

Win10系统电脑开机后总是蓝屏无法使用怎么办?

Win10系统电脑开机后总是蓝屏无法使用怎么办?电脑开机的时候出现了蓝屏问题,这个情况是我们的电脑系统不兼容导致的。遇到这个问题一般是需要去进行系统的重装来解决,安装一个更兼容的系统就可以解决问题了。一起来看看详细的解决方法分享吧。…...

Node——使用nvm切换node版本

1. 下载mvn安装包 https://pan.baidu.com/s/1alfyRvwVWr_TrkN0A9Er5g?pwd1v7c 2. 安装后命令输入mvn -v 验证是否安装成功 3. mvn命令 nvm list available 显示可下载的版本nvm install [node版本号] 显示可下载的版本nvm uninstall [node版本号] 删除已安装的指定版本nvm…...

go语言实现的一个基于go-zero框架的微服务影院票务系统cinema-ticket

一个基于go-zero框架的微服务影院票务系统cinema-ticket 前言 项目基本介绍 项目开源地址:butane123/cinema-ticket: 一个基于go-zero框架的微服务影院票务系统cinema-ticket (github.com) 这是一个微服务影院票务系统,基于go-zero框架实现&#xff0c…...

ArcGIS API for JavaScript 4.15系列(3)——Dojo中的css样式操作

1、前言 前一篇博客介绍了Dojo中基础的dom操作方法,主要是针对html中的常用标签和属性进行操作。而一个优秀的线上网站自然也离不开css样式的从旁辅助。在实际开发过程中,我们经常会遇到需要动态修改css样式的问题,本文就来介绍一下如何在Do…...

“赶快回家网”首页制作

“赶快回家网”首页制作一、实验名称:二、实验日期:三、实验目的:四、实验内容:五、实验步骤:六、实验结果:七、源程序:八、心得体会:一、实验名称: “赶快回家网”首页…...

JavaWEB-Servlet

目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码&a…...

springboot集成mqtt

引入jar包 <dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mqtt</artifactId> </dependency> <dependency><groupId>com.alibaba</groupId><artifactId>fastjs…...

Lecture3 梯度下降(Gradient Descent)

目录 1 问题背景 2 批量梯度下降 (Batch Gradient Descent) 3 鞍点(Saddle Point) 3 随机梯度下降 (Stochastic Gradient Descent) 4 小批量梯度下降 (Mini-batch Gradient Descent) 1 问题背景 图1 上节课讲述的穷举法求最优权重值在Lecture2中&#xff0c;介绍了使用穷举…...

深入了解DSP

一、时钟和电源 问&#xff1a;DSP的电源设计和时钟设计应该特别注意哪些方面&#xff1f;外接晶振选用有源的好还是无源的好&#xff1f; 答&#xff1a;时钟一般使用晶体&#xff0c;电源可用TI的配套电源。外接晶振用无源的好。 问&#xff1a;TMS320LF2407的A/D转换精度保证…...

Flink反压如何排查

Flink反压利用了网络传输和动态限流。Flink的任务的组成由流和算子组成&#xff0c;那么流中的数据在算子之间转换的时候&#xff0c;会放入分布式的阻塞队列中。当消费者的阻塞队列满的时候&#xff0c;则会降低生产者的处理速度。 如上图所示&#xff0c;当Task C 的数据处…...

windows无法访问指定设备路径或文件怎么办?2个解决方案

有时候Win10电脑打不开程序或文件&#xff0c;windows无法访问指定设备路径或文件该怎么办&#xff1f;原因是什么呢&#xff1f;一般导致这种情况的出现&#xff0c;大多是因为我们的电脑缺乏相应的查看权限&#xff0c;我们只需要通过赋予权限就可以解决这个难题了。 操作环境…...

冷知识|鹤顶红还能用来修长城?

大家好&#xff0c;我是建模助手。 在上篇浅浅地蹭了波热点之后&#xff0c;我灵机一动&#xff0c;倒不如也搞一搞建筑方面的冷知识&#xff1f;冷热搭配&#xff0c;事半功倍... 问问大家&#xff0c;如果谈起古建筑&#xff0c;关键词都有什么&#xff1f;是庄严、震撼、壮…...

【GD32F427开发板试用】在IAR环境中移植RTX5

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;吴金刚 0.前言 首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。 板子做的虽然简约&#xff0c;但是自带了GD-link所以一根USB…...

MySQl学习(从入门到精通15)

MySQl学习&#xff08;从入门到精通15&#xff09;第 18 章_MySQL 8 其它新特性1. MySQL 8 新特性概述1. 1 MySQL 8. 0 新增特性1. 2 MySQL 8. 0 移除的旧特性2. 新特性 1 &#xff1a;窗口函数2. 1 使用窗口函数前后对比2. 2 窗口函数分类2. 3 语法结构2. 4 分类讲解1. 序号函…...

前端构建工具 Vite

文章目录参考环境构建工具构建工具的主要功能目前主流的前端构建工具Vite为什么使用 Vite冷启动WebpackVite热更新优化热更新优化预构建依赖Webpack VS ViteVite 的缺点首屏性能懒加载与 Vite 相关的基本操作获取create-vite创建项目Project nameSelect a frameworkSelect a va…...

若依框架---PageHelper分页(十)

在前几天的文章中&#xff0c;我们介绍了PageHelper的分页方法&#xff0c;研读代码定位到了ExecutorUtil.pageQuery(...)方法&#xff0c;并阅读到了其中的部分代码。 今天我们将看到重要的SQL修改代码。 getPageSql 我们接着看代码&#xff1a; if (!dialect.beforePage(…...

苹果手机专用蓝牙耳机有哪些?与iphone兼容性好的蓝牙耳机

蓝牙耳机摆脱了线缆的束缚&#xff0c;在地以各种方式轻松通话。自从蓝牙耳机问世以来&#xff0c;一直是行动商务族提升效率的好工具&#xff0c;苹果产品一直都是受欢迎的数码产品&#xff0c;下面推荐几款与iphone兼容性好的蓝牙耳机。 第一款&#xff1a;南卡小音舱蓝牙耳…...

CS-TPGS;壳聚糖修饰维生素E;Chitosan-g-TPGS

Chitosan-g-TPGS,CS-TPGS壳聚糖修饰维生素E聚乙二醇1000琥珀酸酯外观呈现白色固体或者粘稠液体。长期保存需要在-20℃,避光,干燥条件下存放&#xff0c;注意取用一定要干燥,避免频繁溶冻。 维生素E聚乙二醇琥珀酸酯(简称TPGS)是维生素E的水溶性衍生物,由维生素E琥珀酸酯的羧基与…...

easyx的基本使用(万字解析)

easyx的基本使用一.基本框架1.创建文件2.创建窗体-initgraph,closegraph,getchar二.简单的绘制1.圆形-circle2.坐标系统-setorigin,setaspectratio三.简单图形1.绘制点-putpixel2.简单的直线-line3.矩形-rectangle4.椭圆-ellipse5.圆角矩形-roundrect6.扇形-pie7.圆弧-arc四.多…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...