#MYSQL#这是我第11篇MySQL教程了,从今天将开启MySQL教程之喷面试官系列。本篇的主要内容是MySQL触发器的介绍,阅读大概需要三分钟,请各位看官做好心理准备。
MySQL语句都是在被需要的时候切执行,存储过程也是如此,但是你想要知道,某条语句在事件发生时自动执行,你应该怎么办,比如每在数据库每添加一个顾客是,都要检查其电话号码是否正确。每订购一个产品时,都从库存数量中减去订购的数量。无论什么时候删除数据库的某一行时,都要在某个存档的表中保留一个副本。
上面这些举的例子,他们的共同之处就是在他们被需要的时候去自动处理。这确切的说就是触发器。触发器是MySQL想要以DELETE.INSERT.UPDATE语句而自动执行的一条MySQL语句,或者位于BEGIN和END语句之间的一组语句。其他语句都不支持触发器。
触发器在创建的时候,需要给出4条信息,第一个是唯一触发器名,第二个是触发器关联的表,第三个是触发器应该响应的活动,第四个是触发器何时执行。触发器用CREATE TRIGGER语句创建,下面是一个简单的例子。
CREATE TRIGGER 用来创建名为newproduct的新触发器。触发器可在一个操作发生之前或之后执行,这里给出了AFTER INSERT,所以触发器将在INSERT语句成功执行后执行。这个触发器还指定了FOREACH ROW,因此代码对每个插入行都会执行。
需要注意的是每个表最多支持6个触发器,单一的触发器不能与多个事件或多个表关联。所以如果你需要一个队INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。
下面将逐个介绍三种触发器,分别是INSERT触发器,DELETE触发器,UPDATE触发器。
在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被 插入的行; 在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改 被插入的值); 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT 执行之后包含新的自动生成值。
DELETE触发器在DELETE语句执行之后或者执行之前,需要知道两个点,第一在DELETE触发器代码内,你可以引用应该名为OLD的虚拟表,访问被删除的行;第二点,OLD中的值全部都是只读的,不能跟新。
在任意订单被删除前将执行此触发器。它使用一条INSERT语句 将OLD中的值(要被删除的订单)保存到一个名为archive_ orders的存档表中(为实际使用这个例子,你需要用与orders相同的列 创建一个名为archive_orders的表)。 使用BEFORE DELETE触发器的优点(相对于AFTER DELETE触发器 来说)为,如果由于某种原因,订单不能存档,DELETE本身将被放弃。
UPDATE触发器需要注意以下几点。在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问 以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新 更新的值; 在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改 将要用于UPDATE语句中的值);OLD中的值全都是只读的,不能更新。
触发器的一种非常有意义的使用是创建审计跟踪,使用触发器把更改记录到应该表示非常容易的,但是遗憾的是,MySQL触发器不支持CALL语句,这表示不能从触发器内部调用存储过程,所需要的存储过程代码需要复制到触发器内部。至于什么是存储过程,将在下篇介绍。
我们的口号是,MySQL从入门到喷面试官。