MySQL

MySQL 知识量:16 - 40 - 165

12.2 使用触发器><

insert触发器- 12.2.1 -

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触发器- 12.2.2 -

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触发器- 12.2.3 -

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 |
+---------+---------+

注意事项- 12.2.4 -

以下是使用触发器时应当记住的几点事项:

  • 应该使用触发器保证数据的一致性,包括大小写和格式等。在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明的执行,与客户端应用无关。

  • 可以使用触发器创建审计跟踪,把对表的更改(包括前后状态)记录到另一个表中。

  • MySQL不支持在触发器中使用call语句,即不能在触发器中使用存储过程,如果需要大量操作,可以将存储过程的代码复制到触发器内的begin...end代码块中。