触发器是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。
创建MySQL触发器
在MySQL中,创建只有一个执行语句的触发器的基本形式如下:
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句
具体的参数说明如下:
触发器名:指定要创建的触发器名字。
参数BEFORE和AFTER:指定触发器执行的时间。BEFORE指在触发时间之前执行触发语句;AFTER表示在触发时间之后执行触发语句。
触发事件:指数据库操作触发条件,其中,包括INSERT,UPDATE和DELETE。
表名:指定触发时间操作表的名称。
FOR EACH ROW:表示任何一条记录上的操作满足触发事件都会触发该触发器。
delimiter// create trigger auto_save_time before insert on studentinfo for each row insert into timelog(savetime)values(now()); //
在向studentinfo表中插入数据时,savetime表中也会被插入一条当前系统时间的数据。
创建具有多个执行语句的触发器
CREATE TRIGGER 触发器名称 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW
BEGIN
执行语句列表;
END
delimiter// create trigger delete_time_info after delete on studentinfo for each row begin insert into timelog(savetime)values(now()); insert into timeinfo(info)values('deleteact'); end // 当用户对students表执行DELETE操作时,students数据库中的timelog数据表和timeinfo数据表中分别被插入操作时间和操作信息。
在MySQL中,一个表在相同的时间和相同的触发时间只能创建一个触发器,如触发时间INSERT,触发时间为AFTER的触发器只能有一个,但是可以定义BEFORE的触发器。
查看触发器
在MySQL中,可以执行SHOW TRIGGERS语句查看触发器的基本信息,其基本形式如下:
SHOW TRIGGERS;
在命令提示符中输入SHOW TRIGGERS语句即可查看选择数据库中的所有触发器,但是,应用该查看语句存在一定弊端,即只能查询所有触发器的内容,并不能指定查看某个触发器的信息。这样一来,就会在用户查找指定触发器信息的时候带来极大不便。故推荐只在触发器数量较少的情况下应用SHOW TRIGGERS语句查询触发器基本信息。
查看triggers表中触发器信息
在MySQL中,所有触发器的定义都存在该数据库的triggers表中。读者可以通过查询triggers表来查看数据库中所有触发器的详细信息。查询语句如下所示:
SELECT * FROM information_schema.triggers;
其中,information_schema是MySQL中默认存在的库,而information_schema是数据库中用于记录触发器信息的数据表。通过SELECT语句查看触发器信息,如果用户想要查看某个指定触发器的内容,可以通过where子句应用TRIGGER字段作为查询条件。代码如下:
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='触发器名称';
其中,“触发器名称”这一参数为用户指定要查看的触发器名称,和其他SELECT查询语句相同,该名称内容需要用一对“''”(单引号)引用指定的文字内容。
应用触发器
在MySQL中,触发器按以下顺序执行:BEFORE触发器、表操作、AFTER触发器操作。其中,表操作包括常用的数据库操作命令如INSERT、UPDATE、DELETE。
触发器中不能包含START TRANSCATION、COMMIT或ROLLBACK等关键词,也不能包含CALL语句。触发器执行非常严密,每一环都息息相关,任何错误都可能导致程序无法向下执行。由于已经更新过的数据表是不能回滚的,故在设计过程中一定要注意触发器的逻辑严密性。
删除触发器
在MySQL中,既然可以创建触发器,同样也可以通过命令删除触发器,即删除原来已经在某个数据库中创建的触发器,与MySQL中删除数据库的命令相似,删除触发器应用DROP关键字。其语法格式如下:
DROP TRIGGER 触发器名称
“触发器名称”参数为用户指定要删除的触发器名称,如果指定某个特定触发器名称,MySQL在执行过程中将会在当前库中查找触发器。