触发器
触发器是由 INSERT,UPSET,DELETE等事件来触发某种特定操作。
满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样可以保证操作的一致性。
example: 当学生表中新增了一个学生的信息时,学生人数的总数也应该增加,因此我们可以在这里设置一个触发器,当增加一个记录时,执行一次计算人数的操作.
创建触发器
1)创建只有一个执行语句的触发器
create trigger 触发器名 before|after 触发事件 on 表名 for each row 执行语句;
eg:
创建一个由Insert操作触发的触发器。
create trigger trig_name before insert on trig_time for each row insert into trig_time values(now();
在向trig_name表中执行insert操作时,数据库系统都会在insert之前向数据库的trig_time表中插入当前时间。
2)创建有多个执行语句的触发器
create trigger 触发器名 before|after 触发事件 on 表名
for each row
begin 执行语句列表 end;
不同的执行语句之间用分号隔开。但mysql默认情况下是以分号作为结束执行语句的,为了解决这个问题,我们引入delimiter.
delimiter &&可以将结束符变为 &&,在创建完触发器之后,我们可以可以用命令delimiter ;将结束符变为分号。
eg:
delimiter &&
create trigger trig2 after insert on trig_table
for each row
begin
insert into trig_time values(‘13:36:00’);
insert into trig_time values(‘14:36:00’);
end&&
delimiter ;
在向trig_name表中执行insert操作时,数据库系统都会在insert之后向数据库的trig_time表中插入两次当前时间。
从这个例子可以看出,触发器可以同时执行多条执行语句。
MYSQL中一个表在相同触发时间的相同触发事件,只能创建一个触发器。
查看触发器
1)show triggers\G;
show triggers无法查询指定的触发器,显示的是所有触发器的信息。
如果触发器很多时,不方便找到所需触发器的信息。当触发器较少时,可以使用show triggers语句。
2)在triggers中查看触发器信息。
a)查看triggers表中的所有信息。
select * from information_schema.triggers;
b)查看triggers表中的指定的触发器信息。
select * from information_schema.triggers where trigger_name=’触发器名’;
触发器的使用
在MYSQl中触发器的执行顺序是before触发器,表操作(insert,delete,upset)和after触发器。
在激活触发器时,对触发器的执行语句有一定的限制。例如触发器中不能包括:start tranction,commit,rollback等关键词,也不能包含call语句
在触发器的执行过程中,任何步骤出错都会阻止程序向下运行。对于普通表来说,已经被更新过表不能再回滚,更新后的数据继续保持在表中。因此我们在设计触发器的时候应该认真考虑。
删除触发器
drop trigger 触发器名;
如果只指定触发器名称,那么就会在当前数据库下寻找该触发器进行删除。
如果同时指定了数据库名称,那么就会到指定的数据库下去寻找该触发器删除。drop trigger 数据库名.触发器名。
当我们不需要某些触发器时,应及时删除,否则有时执行语句会造成数据的变化。