mysql5之后的版本才支持触发器。
想要某条语句在事件发生时自动执行,可使用触发器。 例如下面场景:
每当增加一条顾客数据时,都检查其号码格式是否正确。每订购一个产品时,都从库存中减去订购的数量无论何时删除一行,都在某个存档表中留一个副本
支持触发器的语句有:delete、insert、update,或位于begin和end语句之间的一组语句。
创建触发器
创建触发器时需要给出4条信息:
唯一的触发器名
触发器关联的表
触发器应该响应的活动(delete、insert 或 update)
触发器何时执行(处理之前或之后)
创建触发器语句如下:
CREATE TRIGGER 触发器名 AFTER INSERT ON 表名 FOR EACH ROW SELECT '提示语:插入成功' INTO @ee;
CREATE TRIGGER用来创建触发器,FTER INSERT表示触发器在执行insert语句后执行,**需要执行前触发可以把fter 改成 before ** 。这个触发器还指定 FOR EACH ROW,表示对每个插入行都执行。
用before或after?通常,将before用于数据验证和净化 (确保插入的数据是表所需要的数据)
然后成功执行插入语句后会提示插入成功,然而并不会,因为上面的意思是把“插入成功”存储到变量ee了,select @ee 可以查看。
也许触发器不能向屏幕显示“插入成功”这种文本。
注意:select后面要加 INTO @err,不然mysql5以上版本会报错:Not allowed to return a result set from a trigger,看网上是这样写的。
只有表才支持触发器,一个表最多6个触发器,视图不支持触发器。
单一触发器不能与多个事件或多个表关联,所以,需要对insert和update操作执行触发器时,应该定义两个触发器。
删除触发器:drop trigger 触发器名;
使用触发器
INSERT 触发器
insert触发器代码内,可以用一个名为new的虚拟表,访问被插入的行。new中的值也可以被更新。
reate trigger 触发器名 after insert on 表1 for each row select new.表1中的列名 into @er;**
执行上面的触发器后,每次插入一行数据都会返回new虚拟表指定的列值到变量er中,可以用select @er 查看
DELETE触发器
在delete触发器代码内,可以引用OLD虚拟表,访问被删除的行
OLD中的值全部是只读的,不能更新
下面例子,使用OLD保存将要被删除的行到一个存档表中:
create trigger 触发器名 before delete on 表1 for each row begin insert into 表2(列,列,列)values(old.表1列名,old.表1列名,old.表1列名);end//
删除表1的数据前会把数据存到结构相同的表2中
使用begin end 块的好处是触发器能容纳多条sql语句
** UPDATE 触发器 **
在update触发器代码中,可以引用一个名为old虚拟表访问以前的值,引用new虚拟表访问新更新的值
new中的值可能被更新,old中的值全部是只读的
create trigger 触发器名 before update on 表1 for each row set new.id = upper(new.id);
显然,每次更新一个行时,new.id 中的值(将用来更新表行的值)都用upper(new.id)替换。 也就是,如果new.id = 110,那用update更新表1的id时,将用110这个值更新。
** 触发器的进一步介绍**
触发器可以用来创建审计跟踪,使用触发器,把更改记录到另一个表非常容易
mysql触发器不支持call语句,这表示不能从触发器内调用存储过程,只能把存储过程代码复制到触发器内