13.触发器

目录

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.hqwc.cn/news/263801.html

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

相关文章

详解ZNS SSD基本原理

ZNS SSD的原理是把namespace空间划分多个zone空间,zone空间内部执行顺序写。这样做的优势: 降低SSD内部的写放大,提升SSD的寿命 降低OP空间,host可以获得更大的使用空间 降低SSD内部DRAM的容量,降低整体的SSD成本 降…

【利用二手车数据进行可视化分析】

利用二手车数据进行可视化分析 查看原始数据去除重复数据需求分析1.统计全国总共有多少量二手车,用KPI图进行展示2.统计安徽总共有多少量二手车,用KPI图进行展示3.统计合肥总共有多少量二手车,用KPI图进行展示4.取最贵的10辆二手车信息&#…

【Table/SQL Api】Flink Table/SQL Api表转流读取MySQL

引入依赖 jdbc依赖 flink-connector-jdbc mysql-jdbc-driver 操作mysql数据库 <!-- Flink-Connector-Jdbc --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-jdbc_${scala.binary.version}</artifactId>…

金融行业文件摆渡,如何兼顾安全和效率?

金融行业是数据密集型产业&#xff0c;每时每刻都会产生海量的数据&#xff0c;业务开展时&#xff0c;数据在金融机构内部和内外部快速流转&#xff0c;进入生产的各个环节。 为了保障基础的数据安全和网络安全&#xff0c;金融机构采用网络隔离的方式来隔绝外部网络的有害攻击…

苹果IOS在Safari浏览器中将网页添加到主屏幕做伪Web App,自定义图标,启动动画,自定义名称,全屏应用pwa

在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上&#xff0c;让我们的web页面看起来像一个本地应用程序一样&#xff0c;通过桌面APP图标一打开&#xff0c;直接全屏展示&#xff0c;就像在APP中效果一样&#xff0c;完全体会不到你是在浏览器中。 1.网站添加样式 在…

《算法与数据结构》答疑

答疑 问题一问题二问题三问题四 问题一 在匹配成功时&#xff0c;在返回子串位置那里&#xff0c;为什么不是i-t的长度啊&#xff0c;为什么还要加一 问题二 问题三 问题四 问&#xff1a;如果题目让我们构造一个哈夫曼树&#xff0c;像我发的这个例题的话&#xff0c;我画成我…

详解异常 ! !(对异常有一个全面的认识)

【本章目标】 1. 异常概念与体系结构 2. 异常的处理方式 3. 异常的处理流程 4. 自定义异常类 1. 异常的概念与体系结构 1.1 异常的概念 在生活中&#xff0c;一个人表情痛苦&#xff0c;出于关心&#xff0c;可能会问&#xff1a;你是不是生病了&#xff0c;需要我陪你去看医…

零基础一看就会?Python实现性能自动化测试竟然如此简单

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能自动化…

[GPT]Andrej Karpathy微软Build大会GPT演讲(下)--该如何使用GPT助手

该如何使用GPT助手--将GPT助手模型应用于问题 现在我要换个方向,让我们看看如何最好地将 GPT 助手模型应用于您的问题。 现在我想在一个具体示例的场景里展示。让我们在这里使用一个具体示例。 假设你正在写一篇文章或一篇博客文章,你打算在最后写这句话。 加州的人口是阿拉…

上班必备——项目部署环境

大家都知道&#xff0c;互联网行业有很多的岗位&#xff0c;前端&#xff0c;后端&#xff0c;产品&#xff0c;测试&#xff0c;ui等。 ui&#xff0c;产品和测试的同事在前端开发的过程中&#xff0c;都会时刻关注着进度&#xff0c;是要看页面效果的&#xff0c;这个时候怎…

java+springboot+ssm学生社团管理系统76c2e

本系统包括前台和后台两个部分。前台主要是展示社团列表、社团风采、社团活动、新闻列表等&#xff0c;前台登录后进入个人中心&#xff0c;在个人中心能申请加入社团、查看参加的社团活动等&#xff1b;后台为管理员与社团负责人使用&#xff0c;应用于对社团的管理及内容发布…

软件无线电SDR-频谱采集python实现

sdr做的频谱采集&#xff0c;保存的500张频谱图&#xff0c;能看出来是什么东西吗&#xff1f;