Mysql教程

9.1创建触发器

触发器是由INSERT、UPDATE、DELETE等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生的信息时,学生的总数就必须同时改变。 可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数是一致的。触发器触发的执行语句可能只有一个,也可能有多个。本节将详细讲解创建触发器的方法。

9.1.1创建只有一个执行语句的触发器

在MySQL中,创建只有一个执行语句的触发器的基本形式如下:

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON表名 FOR EACH ROW执行语句

其中,触发器名参数指要创建的触发器的名字;BEFORE和AFTER参数指定了触发器执行的时间,“BEFORE”指在触发事件之前执行触发语句,AFTER表示在触发事件之后执行触发语句;“触发事件”参数指触发的条件,其中包括INSERT、UPDATE和DELETE;“表名”参数指触发事件操作的表的名称;FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器;“执行语句”参数指触发器被触发后执行的程序。

【示例9-1】下面创建一个由INSERT触发的触发器dept_trigl。代码如下:

CREATE TRIGGER dept_trig1 BEFORE INSERT ON department FOR EACH ROW INSERT INTO trigger_time VALUES(NOW());

结果显示触发器dept_trig1己经创建成功。当向department表中执行INSERT操作时,数据库系统都会在DESERT语句执行之前向trigger_time表中插入当前时间。下面向department表中插入一条记录,然后查看trigger_time表中是否执行INSERT操作。代码执行如下:

执行结果显示,在向department表中执行INSERT操作时,trigger_time中插入了当前的系统时间。从这个例子可以看出,INSERT丁成功的触发了触发器。

9.1.2创建多个执行语句的触发器

MySQL中,触发器触发的执行语句可能有多个。创建有多个执行语句的触发器的基本形式如下:

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW BEGIN执行语句列表END

其中,BEGIN与END直接的“执行语句列表”参数表示需要执行的多个执行语句的内容。不同的执行语句之间用分号隔开。

注意:一般情况下,MySQL默认以;”作为结束执行语句。在创建触发器过程中需 要用到“;”。为了解决这个问题,可以用DELIMITER语句。如“DELIMITER &&”,可以将结束符号变成“&&”。当触发器创建完成后,可以用命令 “DELIMITER;”来将结束符号变成“;”。

【示例9-2】下面创建一个由DELETE触发多个执行语句的触发器dept_trig2。代码如下:

DELIMITER && CREATE TRIGGER dept_trig2 AFTER DELETE ON department FOR EACH ROW BEGIN INSERT INTO trigger_time VALUESC21:01:01');INSERT INTO trigger_time VALUES('22:01:01');END && DELIMITER ;

执行结果显示,触发器创建成功。当在department表中执行DELETE操作后, trigger_time表中将插入两条记录。

执行结果显示,在向DEPARTMENT表中执行DELETE操作时,trigger_time中插入了两条记录。从这个例子可以看出,触发器可以同时执行多条执行语句。

注意:MySQL中,一个表在相同触发时间的相同触发事件,只能创建一个触发器。例如,在department表中,触发事件INSERT,触发时间为AFTER的触发器只能有一个。但是,可以定义触发事件为BEFORE的触发器。如果该表中执行INSERT语句,那么这个触发器就会自动执行。


关注微信获取最新动态