MySQL 知识量:16 - 40 - 165
insert触发器在insert语句执行之前或之后执行。
在insert触发器代码内,可以引用一个名为new的虚拟表,通过它可以访问插入的行。
在before insert触发器中,new中的值可以被更新,即允许在触发器中修改要插入的值。
对于auto_increment(自增)列,new在insert执行之前包含0,在insert执行之后包含新的自动生成值。
例如:创建一个触发器report_insert。
create trigger report_insert after insert on people for each row select new.realName into @newName;
下面在表people中插入一行数据:
insert into people(realName,realAge,sex) values('Cron',22,'male');
插入变量@newName的值:
select @newName;
结果:
+----------+ | @newName | +----------+ | Cron | +----------+
通常,将before用于数据验证和净化,目的是确保插入表中的数据确实是需要的数据。
delete触发器在delete语句执行之前或之后执行。
在delete触发器代码内,可以引用一个名为old的虚拟表,通过它可以访问被删除的行。
old中的值全都是只读的,不能更新。
例如:创建一个触发器report_delete。
delimiter // create trigger report_delete before delete on people for each row begin select old.realName into @d_name; select old.realAge into @d_age; select old.sex into @d_sex; end // delimiter ;
删除表people的一行数据:
delete from people where realName='Jen';
查询变量@d_name、@d_age和@d_sex。
select @d_name,@d_age,@d_sex;
结果为:
+---------+--------+--------+ | @d_name | @d_age | @d_sex | +---------+--------+--------+ | Jen | 12 | female | +---------+--------+--------+
以上触发器定义中,通过使用begin...end块,可以将多条处理语句加入其中,以增强触发器的功能。
如果before delete触发器执行失败,那么删除操作也会取消,因此,触发器可以用于删除检查,这是非常有用的一点。
update触发器在update语句执行之前或之后执行。
在update触发器代码中,可以通过引用一个名为old的虚拟表来访问更新前的值,通过引用一个名为new的虚拟表来访问更新后(新修改)的值。
在before update触发器中,new中的值可以被更新,即允许在触发器中修改要更新的值。
old中的值全都是只读的,不能更新。
例如:创建两个触发器report_update_before和report_update_after。
create trigger report_update_before before update on people for each row select old.realAge into @oldAge; create trigger report_update_after after update on people for each row select new.realAge into @newAge;
以上SQL语句中,为people表定义了两个触发器,分别在更新前和更新后执行。
更新表people:
update people set realAge=32 where realName='Bob';
查询变量:
select @oldAge,@newAge;
结果为:
+---------+---------+ | @oldAge | @newAge | +---------+---------+ | 12 | 32 | +---------+---------+
以下是使用触发器时应当记住的几点事项:
应该使用触发器保证数据的一致性,包括大小写和格式等。在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明的执行,与客户端应用无关。
可以使用触发器创建审计跟踪,把对表的更改(包括前后状态)记录到另一个表中。
MySQL不支持在触发器中使用call语句,即不能在触发器中使用存储过程,如果需要大量操作,可以将存储过程的代码复制到触发器内的begin...end代码块中。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6