触发器

触发器的用途1
利用触发器检查输入数据的合理性 利用触发器维护冗余数据查看触发器

一、为什么使用触发器
触发器(TRIGGER)是MySQL的与表的insert,delete,update语句相关的数据库对象之一,当表上出现特定事件时,比如当对一个表进行操作(insert,delete,update)时, 将激活该对象, 就会自动执行。该对象与编程语言中的函数非常类似,都需要声明、执行等。
触发器(trigger)中定义了一系列操作,这一系列操作被称为是触发程序。触发器是个特殊的存储过程,触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现自动执行。触发器基于一个表定义,但可以引发在多个表上发生一系列自动操作。
在具体应用中,之所以会经常使用触发器数据库对象,是由于该对象能够加强数据库表中数据的完整性约束和业务规则等。
从MySQL 5软件开始才开始支持触发器数据库对象,所以触发器的使用说明适用于MySQL 5或更高级的版本。
触发器(trigger)的执行不是由程序调用,也不是手工启动,而是由事件来触发而自动执行的,比如当对一个表进行操作(insert,delete, update)时就会激活它自动执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS,USER_TRIGGERS 数据字典中查到。
触发器有一个非常好的特性就是:触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。这就像是闯关游戏,闯过一关,再闯下一关,如果有一关没闯过就要从第一关开始。触发器与此类似,即触发程序视为单一交易中的一部分,因此可以由原触发程序还原交易,如果在交易过程中侦测到严重的错误(如使用者中断连线等),则会自动还原整个交易。其作用即是可以保证数据的完整性,或复杂代码的编写简化。

二、创建触发器
1.创建只有一条执行语句的触发器
语法形式:
Create trigger 触发器名称 before|after 激活事件 on 表名 for each row 触发事件 ;

Ø before|after说明触发器执行的时间,即说明触发程序是在激活语句之前或之后执行。before 指的是触激活事件之前先执行触发程序语句然后再执行激活事件,after 指的是激活事件之后执行触发程序语句。
Ø 触发器必须有名字,最多64个字符,可能后面会附有分隔符。它和MySQL中其他对象的命名方式基本一样.
Ø 激活事件,即触发器执行条件,是delete、insert 或 update之一.
INSERT操作:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA语句。
UPDATE操作:更改某行时激活触发程序,例如,通过UPDATE语句和REPLACE语句。
DELETE操作:从表中删除某一行时激活触发程序,例如,通过DELETE语句。
Ø 表名 表示激活事件发生的表的名称。触发程序与此表相关。此表名必须引用永久性物理表,不能将触发程序与视图或TEMPORARY表关联起来。
Ø for each row 表示行级触发器,即对任何一条记录的操作如果满足激活事件, 都会触发该触发器。
Ø 触发事件 表示激活触发器后被自动执行的语句. 如果执行多个语句, 可以使用BEGIN … END复合语句结构。

2.创建包含多条执行语句的触发器
如果当触发程序激活时执行的语句有多个,则可使用BEGIN …END复合语句结构。
语法形式:
create trigger 触发器名称 before|after 激活事件 on 表名 for each row begin 一系列触发事件 end

注:由于“一系列触发事件”中有多个执行语句,这些语句每条都会用默认的分号作为结束符,所以整个create trigger语句就不能分号结束了,此时需要声明最终的结束符,在create trigger语句之前,单独用delimiter来声明新的结束符。如delimiter

Begin与end之间的一系列触发事件表示所要执行的多个执行语句的内容,将每条执行语句用“;”结束。
问题:此时“;”表示每条执行语句的结束,就不能表示整个建触发器的语句的结尾。那么如何区分每条执行语句的结束与表示整个创建触发器的语句的结尾?可以用delimiter来声明最终的结束符。
对于在同个表上创建的触发器,具有相同激活事件的,不能有两个同样的时间。必要时可以有一个是before,一个是after。

触发器的优点
1,触发器的“自动性”。
对其他程序员来说,触发器是看不到的,但是的确存在,如果不用触发器的话,更新了某表的某字段时,还要写代码去更新其他表里面的冗余字段,如果是几张表都有冗余字段时,自动操作就很方便。
2,触发器的数据完整性
触发器有回滚性,就是一共要更新五张表的数据时,不会出现更新了二个张表,而另外三张表没有更新的情况。即要执行就五个表都执行,否则即使中途出错,也都复原数据。
但是如果是用php代码去写的话,就有可能出现更新了二张表的数据,这个时候,数据库运行出错,就会有的更新了,有的没更新。这样页面显示不一致了,会很槽糕。

三、触发器的应用一

  1. 利用触发器检查输入数据的合理性
    输入数据时,检查数据的合理性,只能通过触发器来实现。
  2. 利用触发器维护冗余数据

四、查看触发器
1.通过SHOW TRIGGERS 语句查看触发器
语句为:SHOW TRIGGERS \G
会显示一个列表,显示出当前数据库中已经创建的所有触发器的信息。包括名称、触发事件、触发事件所操作的表、激活触发器的执行语句等.
2.通过查看系统库information_schema实现查看所有数据库中的各自的触发器
use information_schema;
select * from TRIGGERS\G

3.通过查看系统库information_schema实现查看触发器还可以查看某个触发器的详细信息.
语句为:use information_schema;
select * from TRIGGERS Where TRIGGER_name= “tri_diarytime2” \G
4.通过查看系统库information_schema实现查看触发器triggers
use information_schema;
desc TRIGGERS;

五、删除触发器
通过DROP TRIGGER语句删除触发器 drop TRIGGER 触发器名称;

触发器的用途二
只有存储引擎是InnoDB类型的数据表,才能作为主表支持外键功能,可以实现外键约束,当主表中执行update和delete操作时,可以通过在外键中设置“on delete 外键级联选项”或“on update 外键级联选项”,实现在主表中执行update和delete操作时分别在子表中做相应变动。外键约束关系就可以由InnoDB存储引擎自动维护。

外键级联选项cascade、set null或者no action(或restrict)的含义:
Ø CASCADE:当主表中的主键(被某表关联了外键)的字段值被update或delete时, 分别会同步update或delete子表的匹配的外键值.
Ø set null:当主表中的主键(被某表关联了外键)的字段值被update或delete时,分别将子表上相匹配的外键列值自动设置为null值. 此时要注意建立子表时外键列不能设非空not null约束.
Ø RESTRICT与no action相同,即不进行任何操作.即,如果子表中有匹配的记录,则不允许对父表中对应外键关联列做update或delete操作.

下面的情况中可以利用触发器实现数据级联选项

  1. 对于InnoDB类型的存储引擎的数据表,如果没有设置在主表中执行update和delete操作时的外键级联选项cascade、setnull或者no action(或restrict),则外键约束关系就不能由InnoDB存储引擎来自动维护,此时可以通过触发器来实现级联选项,达到外键约束关系的自动维护。
  2. 对于主表是MyISAM类型的存储引擎的数据表,不支持外键功能,此时就不可能通过设置级联选项的方式实现主表与子表之间数据的级联反应。此时可以通过触发器来实现数据级联。

1.用触发器实现表间删除数据的联动
2. 用触发器实现表间更新数据的联动

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

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

相关文章

2024 遗传编程实战(一)基因实战

2024 遗传编程实战(一)基因实战 文章目录 2024 遗传编程实战(一)基因实战一、遗传编程实战介绍1、遗传编程简介2、遗传编程和进化论的关系3、遗传编程过程解释 二、基于遗传编程的例子1、实战题目介绍2、遗传算法的伪代码3、遗传实…

Vue中吸顶导航的实现

目录 1 前言 2 具体步骤 2.1 安装VueUse 2.2 吸顶导航组件中导入useScroll 2.3 在style中定义吸顶导航的两种状态 2.4 template中设置吸顶导航出现的时机 1 前言 本处使用VueUse更便捷的实现吸顶导航,具体内容及更多操作请看官网文档,如下&#x…

从键盘输入两个数,求它们的和并输出 从键盘输入三个数到a,b,c中,按公式值输出

别急别急,先看完 (从初学者出发,大佬勿喷,I am 小小蒟蒻) 从键盘输入两个数,求它们的和并输出 作者 陈春晖 单位 浙江大学 本题目要求读入2个整数A和B,然后输出它们的和。 输入格式: 在一行中给出一…

微信小程序开发系列(三十)·小程序本地存储API·同步和异步的区别

目录 1. 同步API 1.1 getStorageSync存储API 1.2 removeStorageSync获取数据API 1.3 removeStorageSync删除 1.4 clearStorageSync清空 2. 异步API 2.1 setStorage存储API 2.2 getStorage获取数据API 2.3 removeStorage删除API 2.4 clearStorage清空 3. …

每天学习一个Linux命令之ifconfig

每天学习一个Linux命令之ifconfig 在Linux操作系统中,ifconfig命令是一个用来配置和显示网络接口的工具。它可以用来查看和修改网络接口的状态、IP地址、网关、子网掩码等信息。在本文中,我们将详细介绍ifconfig命令的使用方法和常用选项。 1. 命令语法…

Zookeeper搭建

目录 前言 初了解Zookeeper 搭建 准备 配置Zookeeper 前言 今天来介绍Zookeeper的搭建,其实Zookeeper的搭建很简单,但是为什么还要单独整一节呢,这就不得不先了解Zookeeper有什么功能了!而且现在很火的框架也离不开Zookeepe…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)

摘要:开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间…

C语言入门学习 --- 6.指针

文章目录 第六章指针1.指针是什么?这里我们总结一下:问题:省流版: 2.指针和指针类型2.1指针-整数2.2指针的解引用 3.野指针3.1野指针成因3.2如何规避野指针 4.指针运算4.1指针-整数4.2指针-指针4.3指针的关系运算标准规定&#xf…

剑指offer面试题34 丑数

考察点 空间换时间提效知识点 题目 分析 这里面其实用到了一点点的数学知识,丑数的定义是只包含2,3,5因子的数。现在要求第1500个丑数,最简单的办法就是从数字1开始遍历,依次判断每个数字是不是丑数,如果…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的木材表面缺陷检测系统(深度学习+Python代码+UI界面+训练数据集)

摘要:开发高效的木材表面缺陷检测系统对于提升木材加工行业的质量控制和生产效率至关重要。本篇博客详细介绍了如何运用深度学习技术构建一个木材表面缺陷检测系统,并提供了完整的实现代码。该系统采用了强大的YOLOv8算法,并对YOLOv7、YOLOv6…

升级Windows 11 专业版升级密钥永久使用

Windows 11 专业版是 Windows 11 的商业版本,专为中小型企业和组织设计。它提供了一些家庭版和专业版所没有的功能,例如: 安全性: 设备加密:使用 BitLocker 或 BitLocker 设备加密保护您的设备和数据。身份验证:使用…

VUE_nuxt启动只能通过localhost访问,ip访问不到:问题解决

修改项目根目录下的 package.json "config": {"nuxt": {"host": "0.0.0.0","port": "3000"} } 这样项目启动后就可以通过ip进行访问了

保研复习数据结构记(7)--散列查找(哈希表)

哈希表有什么特点?数据元素的关键字与其存储地址直接相关(通过哈希函数相关),典型的用空间换时间的算法处理冲突的方法?拉链法(链地址法),开放定址法,再散列法什么是查找…

mac idea快捷键记录

1.查看接口有多少的实现类,选中下面的这个类,然后commandoptionB 即可。

【JavaEE Spring 项目】消息队列的设计

消息队列的设计 一、消息队列的背景知识二、需求分析核心概念⼀个⽣产者, ⼀个消费者N 个⽣产者, N 个消费者Broker Server 中的相关概念核⼼ API交换机类型 (Exchange Type)持久化⽹络通信消息应答 三、 模块划分四、 项⽬创建五、创建核心类创建 Exchange创建 MSGQUeue创建 B…

【位运算】【脑筋急转弯】2749. 得到整数零需要执行的最少操作数

作者推荐 视频算法专题 本文涉及知识点 2749. 得到整数零需要执行的最少操作数 给你两个整数:num1 和 num2 。 在一步操作中,你需要从范围 [0, 60] 中选出一个整数 i ,并从 num1 减去 2i num2 。 请你计算,要想使 num1 等于 …

对GIS与游戏引擎(UE4 或 U3D)结合的看法

GIS与游戏引擎结合,这在6年前就已经很多公司在进行探索了,经过这几年的发展,结合当前的政策,从以下几方面说一下我的看法: 1.GIS客户都是特殊单位及领域。2018年后,国内已经对国产化有明确要求了&#xff0…

Docker进阶:深入了解容器数据卷

Docker进阶:深入了解容器数据卷 一、前言二、容器数据卷的作用三、容器数据卷的使用方法四、实战--使用docker部署前端项目(数据卷挂载)4.1 重要:准备工作,先在本地创建挂载目录4.2 启动一个临时的nginx容器&#xff0…

LLM(大语言模型)常用评测指标之F1-Score

F1-Score F1-Score 是一种常用于评估分类模型性能的指标,特别是在数据不平衡的情况下。它是精确度 (Precision) 和召回率 (Recall) 的调和平均值,用于衡量模型对正类的预测能力。 计算方法 精确度 (Precision):是指正确预测为正类的数量与所…

pytorch(九)卷积神经网络

文章目录 卷积神经网络全连接神经网络与卷积神经网络的区别概念性知识mnist数据集(卷积神经网络) GoogLeNetInception 残差网络ResNet残差块结构 稠密连接网络网络结构 卷积神经网络 全连接神经网络与卷积神经网络的区别 全连接神经网络是一种最为基础的前馈神经网络&#xf…