MySQL入门教程-触发器

发布时间:2023年12月30日

9.触发器

什么是触发器 触发器(trigger):监视某种情况,并进行某种操作,它的执行并不是程序调用,也不是手工启动,而是由事件来触发,例如:对一张表进行操作(插入,更新,删除)时,就会触发执行事先编辑好的若干条SQL语句。

触发器的特点与作用 触发器里面的sql语句是一个事务,具有原子性,要么全部执行,要么全部不执行。

创建语法解析
?CREATE
? ?  [DEFINER = user]
? ?  TRIGGER trigger_name
? ?  trigger_time trigger_event
? ?  ON tbl_name FOR EACH ROW
? ?  [trigger_order]
? ?  trigger_body
??
?trigger_time: { BEFORE | AFTER }

只触发器触发的时间节点,与紧随其后的 trigger_event: { INSERT | UPDATE | DELETE } 触发操作组合,表示在某个操作执行之前,或之后,需要调用触发器的逻辑

?trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

指这个触发器在触发的时候,与其他的触发器的联动效果。如,我们当前创建的 T1 在触发之前,需要先使用另一个已有的触发器 T2,那么这段的声明就是 PRECEDES T2;我们日常操作中基本不会有联动其他触发器的场景,因此这一段直接可以 省略

?trigger_body

触发器的主体部分。如果有多个操作,即一个 sql 无法完成,那么需要使用 begin... end 语句块将多个操作的 sql 包裹起来

注意项

一、触发器只允许在原始表上创建,即不能在临时表和视图上创建

二、触发器只能绑定到当前 DB 的表上。如果尝试在 DB1 中为 DB2.tab_name 创建触发器时,控制台会报错:**[Err] 1435 - Trigger in wrong schema**

三、触发器的主体部分,如果因多个 sql 操作需要使用 **begin... end** 语句块包裹,那么,记得在 **begin** 之后重命名 mysql 的语句分隔符,在 **end** 之前使用自己重命名的结束符作为结尾!!!

因为 mysql 默认都是以分号结尾,如果我们不重命名语句分隔符,那么 begin end 中只有第一条 sql 生效,剩下的都会忽略,从而执行的结果出乎我们的预期

删除触发器

?DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

[if exists] 是可选的,表示会删除指定的并且存在的触发器;要是不存在,也不会报错

[schema_name.] 触发器所在的 DB 库,如果不指定,就会删除当前库下的这个触发器

查看触发器

我们最习惯的写法就是,第一步先删除目标触发器,第二步就是创建自己需要的触发器,sql 如下:

?drop trigger if exists myTrigger;create trigger myTrigger......

但是,如果我们上来就这么操作,或许会不小心删除已经在运行的同名触发器!!

因此,在触发器创建之前,我们需要确认命名是否被占用,有两个方法:

一、查看当前 DB 中的全部触发器

?show TRIGGERS;

img

二、从系统内置 DB 的 **triggers** 表中查询全部触发器

?SELECT *from information_schema.`TRIGGERS`

img

我们可以通过 where 增加对字段 trigger_name 的条件过滤

一个完整的创建触发器示例:

??
?create trigger  tri_abc after insert
?on grade for each row
? ? begin
?     ? ? select '插入成功' into @abc;
?     end
?     
?      select @abc; ?  -- 显示 null
?     
?     insert into grade(name) values('测试触发器'); ? --插入数据
?     select @abc; ?  -- 显示  插入成功
文章来源:https://blog.csdn.net/ly121862/article/details/135238376
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。