什么是触发器?
触发器定义了一系列操作,这一系列操作称为触发程序,当触发事件发生时,触发程序会自动运行。触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作分别激活该表不同类型的触发程序运行,从而实现数据的自动维护。
创建触发器
语法格式:
create trigger 触发器名 触发时间 触发事件 on 表名 for each row
begin
触发程序
end;
注:
1.触发器是数据库的对象,因此需要指定该触发器隶属于哪个数据库。
2.触发器基于表(严格说是基于表的记录),这里的表是基表,不是临时表,不是视图。
3.触发时间有两种:before和after。
4.触发事件有3种:insert、update、delete。
5.同一个表不能创建两个相同触发时间、触发事件的触发程序。
6.for each row表示行级触发。
7.触发程序中的select语句不能产生结果集。
8.触发程序中可以使用old关键字与new关键字。
(当需要访问新记录的某个字段值时,可使用“new.字段名”的方式访问。)
9.old记录是只读的,可以引用它,但不能更改它。
举个栗子:
info表内容如图,当status=1时,展示在页面上。执行删除操作时,将status置为0,此时并没有真正删除数据,只是不将其展示在页面上。
当管理员向该表中插入数据时,应先检查该表是否存在该数据。若存在,只需将status=1,不存在就插入该数据。
use myclass;
DROP TRIGGER IF EXISTS t_info;
DELIMITER !!
CREATE TRIGGER t_info BEFORE INSERT ON info_copy FOR EACH ROW #触发器不可向基表插入数据,所以此处将其他表作为基表
BEGIN
DECLARE idnum TINYINT;
DECLARE idnum2 TINYINT;
SELECT count(*) as cou into idnum from info where idcard=new.idcard and status=0;
SELECT count(*) as cou2 into idnum2 from info where idcard=new.idcard and status=1;
IF idnum>=1 THEN #存在且状态为0
UPDATE info set status=1 where idcard=new.idcard;
ELSEIF idnum2<=0 THEN #不存在
INSERT INTO info (name,sex,idcard,status) VALUE (new.name,new.sex,new.idcard,1);
END IF;
END
!!
DELIMITER ;
当我们向info_copy表插入数据时,我们检测的时info表是否存在符合的数据。当我们向info_copy表插入存在的数据时:
insert into info_copy(name,sex,idcard) values('weiu','男','510106198908246561');
当我们向info_copy表插入不存在数据时:
insert into info_copy(name,sex,idcard) values('ruiu','女','510106198809246461');
此过程会造成冗余数据,可通过事件调度器对info_copy表进行定期清理。
查看触发器的定义
1.查看当前数据库中所有触发器的信息:show triggers;
2.查看某个触发器的定义:show create trigger t_info;
3.MySQL中所有触发器的定义都存放在information_schema数据库下的triggers表中,查看triggers表时,可查看数据库中所有触发器的详细信息。
select * from information_schema.triggers;
删除触发器
drop trigger 触发器名;
触发器的优缺点
优点:灵活方便
缺点:比较耗费资源,效率低于存储过程,定位缺陷相对困难。