数据库触发器

3/7/2017来源:SQL技巧人气:960

触发器是一种特殊的存储过程,它不带任何的输入输出参数,不能被显式调用。顾名思义,就是当执行某个事件时触发另一个事件的执行。 触发的时间分为两种,分别为DDL(包括CREATE、ALTER和DROP)和DML(包括INSERT、UPDATE和DELETE)两大类。这里只对DML类型触发器进行介绍。 在DML类型触发器中,触发时间分为两类,分别为BEFORE和AFTER。触发事件有insert、update和delete三种,所以触发器共有六种情况,分别为before insert,before update,before delete和after insert,after update,after delete这六种情况。

在写触发器时,经常会用到new和old这两个关键字,那它们的应用范围是怎样的呢?new只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据;update时new表示要替换的新数据行,old表示要被更改的原来的数据行;delete时old表示要被删除的数据。 FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整个表。 BEFORE和AFTER的区别:在before insert和before update触发器中,可以对new进行修改;而在after insert和after update触发器中不能对new进行修改;before和after的触发器都不能对old进行修改。应用举例:在MySQL中,当我们每次对学生数据进行修改时,通过触发器去更新最后更新时间,其代码如下。

-- 本例中,登录用户为root,数据库名为School,修改表为student,每次触发修改最后更新时间updatetime,触发器名student_update
DELIMITER $$
USE `School`$$
DROP TRIGGER /*!50032 IF EXISTS */ `student_update`$$
CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `student_update` BEFORE UPDATE ON `student` 
    FOR EACH ROW BEGIN
		SET new.updatetime :=NOW();
	END;
$$
DELIMITER ;