13.触发器

news2024/11/18 9:26:37

目录

1、创建触发器

1、创建只有一个执行语句的触发器

2、创建有多个执行语句的触发器

2、查看触发器

1、通过SHOW TRIGGERS查看触发器:

2.在triggers 表中查看触发器信息

3、使用触发器

4、删除触发器


1、创建触发器

MySQL 的触发器和存储过程一样,都是嵌入到 MySQL的一段程序。

触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATAE和DELETE语句。

如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作,

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发器(trigger)是个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用, 而触发器的执行不需要使用 CALL 语来调用,也不需要手工启动,只要当一个预定义的

事件发生的时候就会被MySQL自动调用。比如当对fuits表进行操作(INSERT DELETE

或UPDATE)时就会激活它执行。

触发器可以查询其他表,而且可以包含复杂的 SQL 语句。

它们主要用于满足复杂的业务规则或要求。

例如:可以根据客户当前的账户状态,控制是否允许插入新订单。

1、创建只有一个执行语句的触发器

创建一个触发器的语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt

其中

trigger_name标识触发器名称,用户自行指定;

trigger_time 标识触发时机,可以指定为 before 或after;

trigger_event 标识触发事件包括 INSERT UPDATE 和 DELETE;

tbl_name标识建立触发器的表名,即在哪张表上建立触发器;

trigger_stmt 是触发器执行语句。

举例:创建一个单执行语句的触发器,代码如下:

create table  account (acct_num int,amount decimal(10,2)); /*建立一个临 
时账号表*/ 

create trigger ins_sum before insert 
on account
for each row set @sum=@sum+new.amount;

首先创建一个account表,表中有两个字段,分别为:acct_num字段(定义为int类型),

amount 字段(定义成浮点类型):其次创建一个名为 ins_sum 的触发器, 触发的条件是向数据表account插入数据之前,对新插入的amount字段值进行求和计算。

测试一下:

set @sum=0;
insert into account values(1,123.12),(2,321.21);
select @sum;

2、创建有多个执行语句的触发器

创建多个执行语句的触发器的语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW

BEGIN

语句执行列表

END

其中 trigger_name标识触发器的名称,用户自行指定;trigger_time标识触发时机,

可以指定为 before 或after;trigger_event 标识触发事件,包括INSERT、UPDATE和

DELETE:

tbl_name标识建立触发器的表名,即在哪张表上建立触发器:

触发器程序可以使用BEGIN和END作为开始和结束,中间包含多条语句。

举例:创建一个包含多个执行语句的触发器,代码如下:

创建表

create table test1(a1 int);
create table test2(a2 int); 
create table test3(a3 int not null AUTO_INCREMENT primary key); 
create table test4( 
a4 int not null AUTO_INCREMENT primary key, 
b4 int default 0 
); 

创建触发器

delimiter //
create trigger testref  before insert on test1
for each row 
begin
insert into test2 set a2 = new.a1;
delete from test3 where a3 = new.a1;
update test4 set b4=b4+1 where a4=new.a1;
end //
delimiter ;

初始化一些数据

INSERT INTO test3 (a3) VALUES 
(NULL),(NULL),(NULL),(NULL),(NULL), 
(NULL),(NULL),(NULL),(NULL),(NULL); 
INSERT INTO test4 (a4) VALUES (0),(0),(0),(0),(0), (0),(0),(0),(0),(0); 

上面的代码是创建了一个名为 testref 的触发器,

这个触发器的触发条件是在向表 test1插入数据前执行触发器的语句,

具体执行的代码如下:

开始前:

执行如下插入操作,会自动触发触发器完成test2,test3,test4 表的自动变更。

insert into test1 values (1),(3),(1),(7),(1),(8),(4),(4); 

那么4个表中数据如下:

执行结果显示,在向表test1 插入记录的时候,test2、test3、test4 都发生了变化。

从这个例子看INSERT触发了触发器,向 test2 中插入了 test1 中的值,

删除了test3 中相同的内容同时更新了test4中的b4,即与插入的值相同的个数。

查看触发器是指查看数据库中已存在的触发器的定义、状态和语法信息等。

2、查看触发器

可以通过命令来查看已经创建的触发器。

两种查看触发器的方法,分别是:SHOW TRIGGERS 和在triggers表中查看触发器信息。

1、通过SHOW TRIGGERS查看触发器:

show triggers;

通过SHOW TRIGGERS命令查看一个触发器,代码如下:

show triggers \G;

创建一个简单的触发器,名称为 trig_update,每次向account表更新数据之后都会向

名称为myevent的数据表中插入一条记录,数据表myevent定义如下:

create table myevent   
( 
id int(11) default null, 
evt_name char(20) default null 
); 

创建触发器的执行代码如下

create trigger trig_update before insert on account
for each row 
insert into myevent values (1,'after update'); 

使用SHOW TRIGGERS \G 命令查看触发器

Trigger表示触发器的名称 在这里两个触发器的名称分别为ins_sum和trig_update;

Event表示激活触发器的事件 这里的两个触发事件为插入操作INSERT 和更新操作

UPDATE;

Table表示激活触发器的操作对象表,这里都为 account表;Timing表示触发器触发的时

间,

分别为插入操作之前(BEFORE和更新操作之后(AFTER);Statement 表示触发器执行的

操作

还有一些其他信息,比如 SQL 的模式、触发器的定义账户和字符集等,这里不再一一

介绍。

2.在triggers 表中查看触发器信息

在MySQL中所有触发器的定义都存在INFORMATION_SCHEMA数据库的

TRIGGERS表格中,

可以通过查询命令SELECT来查看,具体的语法如下:

SELECT  FROM  INFORMATION_SCHEMA.TRIGGERS  WHERE  Condit1on;

举例:

select * from INFORMATION_SCHEMA.TRIGGERS where TRIGGER_NAME= 'ins_sum'\G; 

从上面的执行结果可以得到:TRIGGER_SCHEMA 表示触发器所在的数据库;

TRIGGER_NAME 后面是触发器的名称,

EVENT_OBJECT_TABLE表示在哪个数据表上触 发

ACTION_STATEMENT表示触发器触发的时候执行的具体操作

ACTION_ORIENTATION是ROW,表示在每条记录上都触发:

ACTION_TIMING表示触发的时刻是 AFTER,剩下的是和系统相关的信息。

也可以不指定触发器名称,这样将查看所有的触发器,命令如下:

select * from INFORMATION_SCHEMA.TRIGGERS \G; 

这个命令会显示这个TRIGGERS表中所有的触发器信息。

3、使用触发器

使用触发器:

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。

触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。

可以将触发程序设置为在执行语句之前或之后激活。

例如,可以在从表中删除每一行之前或在更新每一行之后激活触发程序。

创建一个在account 表插入记录之后,更新myevent 数据表的触发器,代码如下:

create table myevent (id int, log text); 
create trigger trig_insert after insert
on account
for each row
insert into myevent values(2,'after insert');

上面的代码创建了一个trig_insert的触发器在向表account插入数据之后会向表myevent

插入一组数据,代码执行如下:

insert into account values (1,1.00), (2,2.00);
select * from myevent;

从执行的结果来看,是创建了一个名称为 trig insert 的触发器,

它是在向account 插入记录之后进行触发,执行的操作是向表myevent插入一条记录。

4、删除触发器

使用DROP TRIGGER 语句可以删除MySQL中已经定义的触发器

删除触发器语句基本语法格式如下:

DROP TRIGGER [schema_name.] trigger_name

其中,schema_name表示数据库名称,是可选的。如果省略了schema,

将从当前数据库中舍弃触发程序;trigger_name 是要删除的触发器的名称。

举例:删除一个触发器,代码如下:

DROP TRIGGER test.ins;

上面的代码中test 是触发器所在的数据库,ins 是一个触发器的名称。代码执行如下:

drop trigger test.trig_insert;

触发器trig_insert删除成功。

查询确认已经删除:

show triggers \G;

注意事项:

疑问1:使用触发器时须特别注意

在使用触发器的时候需要注意,对于相同的表,相同的事件只能创建一个触发器,

比如对表account创建了一个BEFORE INSERT触发器那么如果对表account再次

创建一个BEFORE INSERT触发器,MySQL将会报错,此时,只可以在表account

上创建AFTER INSERT或者BEFORE UPDATE类型的触发器。灵活地运用触发器将为操作省去很多麻烦。

疑问2:及时删除不再需要的触发器

触发器定义之后,每次执行触发事件,都会激活触发器并执行触发器中的语句。如果需求发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而会影响新的数据的完整性。因此,要将不再使用的触发器及时删除。

练习题:

(1)创建INSERT事件的触发器

create table a (id int, yeat int); 
create table a1 (id int, log text); 
select * from a1;
create trigger trig_a1 after insert
on a
for each row
insert into a1 values(2,'after insert');

insert into a values (1,100), (2,200);
select * from a1;

(2)创建UPDATE事件的触发器。

create trigger trig_a2 after update
on a
for each row
insert into a1 values(3,'after insert');

update a 
set id = 2, yeat=100
where id = 2;
select * from a1;

(3)创建DELETE事件的触发器。

create trigger trig_a3 after delete
on a
for each row
insert into a1 values(4,'after insert');

delete from a where id = 2;
select * from a1;

(4)查看触发器,并使用触发器。

show triggers \G;

select * from INFORMATION_SCHEMA.TRIGGERS where TRIGGER_NAME= 'trig_a2'\G; 

(5)删除触发器。

drop trigger trig_a3;

select * from INFORMATION_SCHEMA.TRIGGERS where TRIGGER_NAME= 'trig_a3'\G; 

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

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

相关文章

高效扫频阻垢装置广谱感应水处理设备介绍工作原理使用参数和选型

​ 1:高效扫频阻垢装置设备介绍 高效扫频阻垢装置是一种通过控制箱释放变频电磁信号,传输到信号放大装置,管道外侧的电磁线圈和电锤产生高频机械振动,在管道和水中传输,通过共振机理破坏水分子之间的氢键,产…

ubuntu 命令行安装 conda

安装包地址: Index of / 找到对应的版本,右键点复制链接 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.shbash Anaconda3-2023.09-0-Linux-x86_64.sh https://linzhji.blog.csdn.net/article/details/126530244

计算机病毒判定专家系统原理与设计《文字提取人工修正》

内容源于网络。网络上流转的版本实在是不易阅读, 又不忍神作被糟蹋故稍作整理,对于内容仍然有识别不准的地方,网友可留言,我跟进修改。 雷 军 (武汉大学计算机系,430072) 摘要: 本文详细地描述了…

Excel表格转换word的两个方法

Excel表格想要转换到word文档中,直接粘贴复制的话,可能会导致表格格式错乱,那么如何转换才能够保证表格不错乱?今天分享两个方法,excel表格转换为word文件。 方法一: 首先打开excel表格,将表格…

Linux部署Kettle(pentaho-server-ce-9.4.0.0-343)记录/配置MySQL存储

下载地址 Kettle 是一个开源的数据集成工具,它是 Pentaho Data Integration(PDI)项目的一部分。要访问 Kettle 的官方网站,可以通过访问其母公司 Hitachi Vantara 的网站来找到相关信息 官方网站:https://www.hitachi…

面试 JVM 八股文五问五答第一期

面试 JVM 八股文五问五答第一期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1.JVM内存布局 Heap (堆区) 堆是 OOM 故障最主要的发生区域。它是内存…

class074 背包dp-分组背包、完全背包【算法】

class074 背包dp-分组背包、完全背包【算法】 算法讲解074【必备】背包dp-分组背包、完全背包 code1 P1757 通天之分组背包 // 分组背包(模版) // 给定一个正数m表示背包的容量,有n个货物可供挑选 // 每个货物有自己的体积(容量消耗)、价值(获得收益)、组号(分组)…

分布式搜索引擎02

分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

小红书笔记种草表现怎么看,营销攻略!

小红书平台的传播,离不开内容种草。当我们撰写好一篇笔记并进行发布后,该如何衡量这篇笔记的种草表现呢?今天我们为大家分享下小红书笔记种草表现怎么看,营销攻略! 一、小红书笔记种草衡量指标 想要了解小红书笔记种草表现怎么看…

智能监控平台/视频共享融合系统EasyCVR接入大华SDK后只有一路通道可云台控制该如何解决?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

31、卷积 - 参数 dilation 以及空洞卷积

在卷积算法中,还有一个不常见的参数叫做dilation(中文:膨胀)。 很多同学可能没听说过这个参数,下面看看这个参数有什么作用,用来控制什么的。 我们还是放这个经典的卷积运算图,图中是看不出 dilation 这个参数的存在的。 如果再换一张图呢,发现两图的区别了吗? 没错…

蓝桥杯Web组学习总结 - 目录导航版

HTML5 HTML 基础标签 HTML5 标签列表 HTML5 新特性 HTML5都有哪些新特性? CSS3 CSS 基础语法 CSS参考手册 盒子模型 CSS Box Model (盒子模型) 浮动与定位?? CSS 浮动(float)与定位(position) CSS布局之浮动和定位 CSS3 新特性 …

Python从入门到精通五:Python数据容器

数据容器入门 为什么学习数据容器 思考一个问题:如果我想要在程序中,记录5名学生的信息,如姓名。 如何做呢? 学习数据容器,就是为了批量存储或批量使用多份数据 Python中的数据容器: 一种可以容纳多份…

【每日一题】—— B. StORage room(Codeforces Round 912 (Div. 2))(位操作符)

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

LeetCode5.最长回文子串

昨天和之前打比赛的队友聊天,他说他面百度面到这道算法题,然后他用暴力法解的,面试官让他优化他没优化出来,这道题我之前没写过,我就想看看我能不能用效率高一点的方法把它做出来,我一开始就在想用递归或者…

排程系统中关于任务优先级的需求延伸与设计构思

无论是面向销售订单的MPS,还是基于多工序制约关系的APS,还是具体车间生产中针对单一工序的任务作业调度优化,都存在基于被排程对象(例如销售订单、生产工单、工序任务)的优先级进行优化的需求场景。当我们仅在宏观、较高层次的角度考虑&#…

Linux高级管理-基于域名的虚拟Web主机搭建

客服机限制地址 通过 Require 配置项&#xff0c;可以根据主机的主机名或P地址来决定是否允许客户端访问。在httpd服 务器的主配置文件的<Location>&#xff0c;<Directory>、<Files>、<Limit>配置段中均可以使用Require 配置 项来控制客户端的访问。使…

Python常见面试知识总结(二):数据结构、类方法及异常处理

【十三】Python中assert的作用&#xff1f; Python中assert&#xff08;断言&#xff09;用于判断一个表达式&#xff0c;在表达式条件为 f a l s e false false的时候触发异常。 断言可以在条件不满足程序运行的情况下直接返回错误&#xff0c;而不必等待程序运行后出现崩溃…

openGauss学习笔记-153 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_probackup

文章目录 openGauss学习笔记-153 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_probackup153.1 背景信息153.2 前提条件153.3 限制说明153.4 命令说明153.5 参数说明153.6 备份流程153.7 故障处理 openGauss学习笔记-153 openGauss 数据库运维-备份与恢复-物理备份与恢…

java.net.SocketException: Connection reset

背景 在我用socket进行TCP通信的时候&#xff0c;当我关闭client端时在服务端出现了Connection reset的异常。 一、问题 下面是异常信息&#xff1a; Exception in thread "Thread-12" java.lang.RuntimeException: java.net.SocketException: Connection reseta…