深入浅出解析——MYSQL|触发器

举报
Thunder Wang 发表于 2023/01/31 21:26:00 2023/01/31
【摘要】 发器是一个被指定关联到-个表的过程式数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某些)MySQL语句在特定事件发生时自动执行,本文主要介绍一下MYSQL中六种触发器的案例。

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。


💅文章概要:触发器是一个被指定关联到-个表的过程式数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某些)MySQL语句在特定事件发生时自动执行,本文主要介绍一下MYSQL中六种触发器的案例。


🤟每日一言:只有你爬到山顶了,这座山才会支撑着你。


文章概要

1.触发器概念

2.触发器类型

3.触发器的创建

4.触发器实例的创建和使用

5.触发器的删除


1.触发器概念

触发器是一个被指定关联到-个表的过程式数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某些)MySQL语句在特定事件发生时自动执行。例如:

●每当增加一个客户到数据库的客户基本信息表时,都检查其电话号码的格式是否正确。
●每当客户订购一个产品时,都从产品库存量中减去订购的数量。
●每当删除客户基本信息表中一个客户的全部基本信息数据时,该客户所订购的未完成订单信息也应该被自动删除。
●无论何时删除一行,都在数据库的存档表中保留一个副本。

触发器与表的关系十分密切,用于保护表中的数据。当有操作影响到触发器所保护的数据时,触发器就会自动执行,从而保障数据库中数据的完整性,以及多个表之间数据的一致性。具体而言,触发器就是MySQL响应INSERT、UPDATE和DELETE语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组MySQL语句)。需要注意的是,其他MySQL语句是不支持触发器的。


2.触发器的类型

● INSERT触发器
INSERT触发器可在INSERT语句执行之前或者之后执行,在INSERT触发器内可引用一个名为NEW的虚拟表来访问被插入的行,NEW的值可以被更新

● DELETE触发器
DELETE触发器可在DELETE语句执行之前或者之后执行,在DELETE触发器内可引用一个名为OLD的虚拟表来访问被删除的行,OLD的值不可以被更新,全部是只读的

● UPDATE触发器
UPDATE触发器可在UPDATE语句执行之前或者之后执行,在UPDATE触发器内可引用一个名为NEW的虚拟表来访问被更新的行,也可以引用一个名为OLD的虚拟表来访问更新之前的行,OLD的值全部只读,NEW的值可以被更新


3.触发器的创建

在MYSQL中,创建触发器的一般语句是:

CREATE
    TRIGGER trigger_name trigger_time trigger_event
    ON tb_name FOR EACH ROW  trigger_body

其中:各参数介绍如下

trigger_name
触发器名称,用来区分不同的触发器,名称在当前数据库是唯一的
trigger_name
触发器触发的时间点,有两个参数可选:BEFORE和UPDATE。一般来说,BEFROE节点用于在执行语句执行前对触发器进行调用,AFTER节点用于在执行语句执行后对触发器进行调用。
trigger_event
触发器的事件,有三个参数可以选择:INSERT,DELETE和UPDATE
tb_name
触发器要作用的的数据表
trigger_body
触发器的主体执行语句,可以使用BEGIN...END复合语句结构,下面代码实例中均采用该种复合语句结构

因为触发器的创建和使用不能分割开来,每一个触发器的创建和调用都需要根据具体的实例创建,所以触发器实例的创建和使用全部在下一小节讲解


4.触发器实例的创建和使用

(一). after insert触发器实例

(给定了表tbl_student和tbl_teacher,每次向tbl_student表插入一条新的记录后,自动向tbl_teacher表中赋值"Frank"老师的名字)


1. 表单结构
tbl_student

tbl_teacher

2. after insert触发器的创建

DELIMITER //
CREATE TRIGGER after_insert_trigger AFTER INSERT ON tbl_student FOR EACH ROW
begin 
   INSERT INTO tbl_teacher VALUES("Frank");
end//
DELIMITER ;

3. 效果展示



(二). before insert触发器实例


(给定了表tbl_student,每次向tbl_student表插入一条新的记录后,将新插入的记录都更新为"123")

ps: before insert触发器一般用于更新new的值和检查数据


1. 表单结构
tbl_student

2. before insert触发器的创建

DELIMITER //
CREATE TRIGGER before_insert_trigger BEFORE INSERT ON tbl_student FOR EACH ROW
begin       
     set new.stu_id = "123";
end//
DELIMITER ;

3. 效果展示


(三). after delete触发器实例


(给定了表tbl_student和tbl_teacher,每次删除tbl_student表中的记录后,自动删除tbl_teacher表中的所有记录)
1. 表单结构
tbl_student


tbl_teacher

2. atfer delete触发器的创建

DELIMITER //
CREATE TRIGGER after_delete_trigger after delete ON tbl_student FOR EACH ROW
begin       
    delete from tbl_teacher;
end//
DELIMITER ;

3. 效果展示


(四). before delete触发器实例


(给定了表tbl_student和tbl_student_2,每次删除tbl_student表中的记录后,自动备份该条记录到tbl_student_2表中)
1. 表单结构
tbl_student


tbl_student_2

2. before delete触发器的创建

DELIMITER //
CREATE TRIGGER before_delete_trigger before delete ON tbl_student FOR EACH ROW
begin       
    insert into tbl_student_2 values(old.stu_id);
end//
DELIMITER ;

3. 效果展示


(五). after update触发器实例


(给定了表tbl_student和tbl_student_2,每次更新tbl_student表中的记录后,自动备份该条记录到tbl_student_2表中)
1. 表单结构
tbl_student

tbl_student_2

2. after update触发器的创建

DELIMITER //
CREATE TRIGGER after_update_trigger after update ON tbl_student FOR EACH ROW
begin       
    insert into tbl_student_2 values(old.stu_id);
end//
DELIMITER ;

3. 效果展示


(六). before update触发器实例


(给定了表tbl_student,每次更新tbl_student表中的记录后,自动修改其自身表中stu_id 所对应老师的名字为'Frank')

ps: before update触发器一般用于更新表自身中的数据


1. 表单结构
tbl_student

2. before update触发器的创建

DELIMITER //
CREATE TRIGGER before_update_trigger before update ON tbl_student FOR EACH ROW
begin       
    set new.tea_name = 'Frank';
end//
DELIMITER ;

3. 效果展示


5.触发器的删除

在MYSQL中,删除触发器的一般语句是:

DROP TRIGGER [IF EXISTS] trigger_name

其中:各参数介绍如下

[IF EXISTS]
可选项,用于避免在没有触发器的情况下删除触发器
trigger_name
要删除的触发器名称

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。