数据库之触发器

本篇介绍MySQL中的触发器,部分内容是笔者摘抄自《数据库系统概念》,仅当作笔记。

触发器(trigger)是一条语句,当对数据库做修改时,它自动被系统执行。要设置触发器机制,必须满足两个要求:

  1. 指明什么条件下执行触发器。它被分解为一个引起触发器被检测的事件和一个触发器执行必须满足的条件;
  2. 指明触发器执行时的动作。一旦我们把一个触发器输入数据库,只要指定的事件发生,相应的条件满足,数据库系统就有责任去执行它。

MySQL使用create trigger语句创建触发器,其基本形式如下:

DELIMITER 结束标识符
CREATE TRIGGER 触发器名称
<BRFORE | AFTER> <INSERT | UPDATE | DELETE>
ON 表名
FOR EACH ROW
BEGIN
<触发器主体>
END 结束标识符
DELIMITER ;

其中before和after是指此触发器触发时机,insert、update和delete是指触发此触发器的事件,for each row指关系中的任意一个元组满足触发事件时都会触发该触发器。

在之前定义函数时的流程控制语句同样可以使用在触发器中,但触发器比函数多了两个关键字:NEW和OLD,它们都用来表示触发器所在的关系中触发了触发器的那一个元组,但他们表示的时间不同,表现在三种事件中如下:

  1. insert:new表示将要或者已经插入的元组,此事件没有old;
  2. update:old表示更新之前的元组,new表示更新之后的元组;
  3. delete:old表示将要删除或已经删除的元组,此事件没有new。

在触发器中都可以使用new.属性名或old.属性名来实现对新旧数据的读或写,在触发器主体中这种形式类似与一个参数,不同的是此”参数值“可能会永久保存在数据库中。例如在关系city中定义一个触发器,作用为在更新某个元组时,判断如果is_hot属性为1,则将state属性更新为0,否则更新为1,其语句如下:

DELIMITER //
CREATE TRIGGER update_state
BEFORE UPDATE
ON city
FOR EACH ROW
BEGIN
    IF(OLD.is_hot = 1) THEN SET NEW.state = 0;
    ELSE SET NEW.state = 1;
    END IF;
END //
DELIMITER ;

在触发器中也可以对其他表(非当前触发器所在表)进行插入、更新和删除操作,但不可以对当前表进行insert、update和delete操作,因为会造成循环调用。

查看所有的触发器的SQL语句如下:

SHOW TRIGGERS;

删除指定触发器的SQL语句基本形式如下:

DROP TRIGGER 触发器名称;

MySQL中的触发器是按照before触发器、元组操作和after触发器的顺序执行的,任何一步发生错误都不会继续执行。另外,数据库是针对关系中每一行数据且在我们使用时不知道当前关系是否有触发器,当前表可能存在触发器在修改当前表时修改其他表,维护成本大大增加。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值