什么是触发器 触发器(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;
二、从系统内置 DB 的 **triggers**
表中查询全部触发器
?SELECT *from information_schema.`TRIGGERS`
我们可以通过 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; ? -- 显示 插入成功