6.触发器(trigger)
含义:触发器也是一段预先定义好的代码(跟存储过程和存储函数一样),并有个名字。
但:
它不能调用,而是,在某个表发生某个事件(增、删、改)的时候,会自动“触发”而调用起来。
定义形式:
Create trigger 触发器名 触发时机 触发事件 on 表名 for eachrow
Begin
//语句块
End;
说明:1.触发时机只有两个:before(在之前),after(在之后);
2.触发事件只有三个:insert、update、delete
3.触发器的含义是:在某个表上进行insert、update以及delete之前或之后,会去执行其中写好的代码(语句);即只有6个情形会可能调用该触发器
4.通常触发器用于在对某个表进行增删改的操作的时候,需要同时去做另外一件事情的时候
5.在触发器内部有两个关键字代表某种特定的含义,可以用来获取数据
New:代表当前正要执行的insert或update的时候的“新行“数据,通过它,可以获取这一新行数据的任意一个字段的值,形式为:
Set @v1=new.id;//获取新插入或update行的id字段的值
Old:代表当前正要执行的delete的时候的“旧行“数据,通过它,可以获取这一新行数据的任意一个字段的值,形式为:
Set@v1=old.id;
Tab_int_max1始终存储tab_int的最大值,当tab_int中插入数据时,触发器执行
例:
create trigger tri1 after insert on tab_int for each row
Begin
Delete from tab_int_max1; #删除tab_int_max1中所有值
Select max(f1) into @maxf1 from tab_int; #取得tab_int中的最大值存入变量
Select f2 into @v2 from tab_int where f1=@maxf1;
Select f3 into @v3 from tab_int where f1=@maxf1;
Insert into tab_int_max1 (f1,f2,f3) values (@maxf1,@v2,@v3);
End;
在表tab_int进行insert之前,将该行数据同时插入到跟其类似结果的表(tab_int_some)中。
create trigger copy_data before insert on tab_int for each row
Begin
Set @v1=new.f1; #获得新行的字段f1的值
Set @v2=new.f2; #获得新行的字段f2的值
Insert into tab_int_some (f1,f2) values (@v1,@v2);
End;