MYSQL触发器

触发器是一种数据库对象,用于在特定表的insert、update、delete操作时自动执行一系列维护数据的操作。本文详细介绍了触发器的创建、使用示例及优缺点。通过示例展示了如何在数据插入时检查并更新相关信息,避免冗余数据。同时,提到了触发器可能导致的资源消耗和效率问题,并提供了查看和删除触发器的方法。
摘要由CSDN通过智能技术生成

什么是触发器?

触发器定义了一系列操作,这一系列操作称为触发程序,当触发事件发生时,触发程序会自动运行。触发器主要用于监视某个表的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,此时并没有真正删除数据,只是不将其展示在页面上。
info表
当管理员向该表中插入数据时,应先检查该表是否存在该数据。若存在,只需将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 触发器名;

触发器的优缺点

优点:灵活方便
缺点:比较耗费资源,效率低于存储过程,定位缺陷相对困难。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值