一、学习任务1:为什么使用触发器
在MySQL数据库中,数据库对象表是存储和操作数据的逻辑结构,而本章所要介绍的数据库对象触发器则用来实现由一些表事件触发的某个操作,是与数据库对象表关联最紧密的数据库对象之一.在数据库系统中,当执行表事件时,则会激活触发器,从而执行其包含的操作。
触发器操作包含创建触发器、查看触发器和刪除触发器,这些操作同样也是数据库管理中最基本、最重要的操作。
触发器(TRIGGER)是MySQL的数据库对象之一,该对象与编程语言中的函数非常类似,都需要声明、执行等。但是触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行。
那么为什么要使用数据库对象触发器呢?在具体开发项目时,经常会遇到如下实例:
• 在学生表中拥有字段学生名字,字段学生总数,每当添加一条关于学生记录时,学生的总数就必须同时改变。
• 在顾客信息表中拥有字段顾客名字,字段顾客的电话和字段顾客的地址缩写,每当添加一条关于顾客记录时,都需要检查电话号码格式是否正确,顾客地址缩写是否正确。
上述实例虽然所需实现的业务逻辑不同,但是它们也有共同之处,即都需要在表发生更改时,自动进行一些处理。这时就可以使用触发器处理数据库对象,例如,对于第一个实例,可以创建一个触发器对象,每次添加一条学生记录时,就执行一次计算学生总数的操作,这样就可以保证每次添加一条学生记录后,学生总数与学生记录数一致。MySQL软件在触发如下语句时,就会自动执行所设罝的操作:
- DELETE语句。
- INSERT语句。
- UPDATE语句。
其他SQL语句则不会激活触发器。在具体应用中,之所以会经常使用触发器数据库对象,是由于该对象能够加强数据库表中数据的完整性约束和业务规则等。从MySQL5软件开始才开始支持触发器数据库对象。
二、学习任务2:创建触发器
触发器的操作包括创建触发器、査看触发器及删除触发器。本节将详细介绍如何创建触发器。按照激活触发器时所执行的语句数目,可以将触发器分为“一个执行语句的触发器”和“多个执行语句的触发器”。
2.1 创建有一条执行语句的触发器
MySQL中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下:
create trigger trigger_name
BEFORE|AFTER trigger_EVENT ON TABLE_NAME FOR EACH ROW
trigger_STMT;
在上述语句中,trigger_name参数表示所要创建的触发器名字,在具体创建触发器时,触发器标识符不能与已经存在的触发器重复。除了上述要求外,建议触发器名命名(标识符)为trigger_xxx或者tri_xxx;BEFORE和AFTER参数指定了触发器执行的时间,其中前者是指在触发器事件之前执行触发器语句,后者是指在触发器事件之后执行触发器语句;trigger_EVENT参数表示触发事件, 即触发器执行条件,包含DELETE、INSERT和UPDATE语句;TABLE_NAME参数表示触发事件操作表的名字;FOR EACH ROW参数表示任何一条记录上的操作满足触发事件都会触发该触发器;trigger_STMT参数表示激活触发器后被执行的语句。
2.2 创建包含多条执行语句的触发器
MySQL中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下:
create trigger trigger_name
BEFORE|AFTER trigger_EVENT ON TABLE_NAME FOR EACH ROW
BEGIN
trigger_STMT1;
trigger_STMT2;
END$$
在上述语句中,比“只有一条执行语句的触发器”语法多出来了关键字BEGIN和END,这两个关键字之间为所要执行的多个执行语句的内容,执行语句之间用分号隔开。
在MySQL软件中,一般情况下用“;”符号作为语句的结束符号,可是在创建触发器时,需要用到“;”符号作为执行语句的结束符号。为了解决该问题,可以使用关键字DELIMITER语句,例 如“DELIMlTER$$”,可以用来实现将结束符号设置成“$$”。
三、学习任务3:查看触发器
触发器的操作包括创建触发器、査看触发器及删除触发器。本节将详细介绍如何査看触发器, 在MySQL软件中可以通过两种方式来查看触发器,分别为通过SHOW TRRIGGERS语句和通过查看系统表triggers实现。
-
- 通过SHOW TRIGGERS语句查看触发器
对于初级用户,当创建触发器时,除了经常会发生“ERROR1359 (HY000): Trigger akeady exists” 错
误之外,还会发生如下图所示的错误。
之所以不能正确创建触发器“tri_diarytime2”,除了因为该触发器已经存在外,还因为在MySQL软件中,MySQL对于具有相同触发程序动作时间和事件的给定表,不能有两个触发器。因此对于有经验的用户,在创建触发器之前,需要查看MySQL软件中是否己经存在该标识符的触发器和触发器的相关事件。
那么如何查看MySQL软件中已经存在的触发器呢?在MySQL软件中査看已经存在触发器,通过SQL语句SHOW TRIGGERS来实现,其语法形式如下:
SHOW TRIGGERS \G
【运行效果】执行上面的80匕语句,其结果如下图所示。
通过执行SQL结果可以发现,执行完SHOW TRIGGERS语句后,会显示一个列表。在该列表中,会显示出所有触发器的信息。其中TRIGGER参数表示触发器的名称;EVENT参数表示触发器的激活事件;Table参数表示触发器对象触发事件所操作的表;Statement参数表示触发器激活时所执行的语句;Timing参数表示触发器所执行的时间;其他参数不重要,现阶段不需要掌握。
-
- 通过查看系统表triggers实现查看触发器
在MySQL软件中,在系统数据库information_schema中存在一个存储所有触发器信息的系统表 triggers,因此查询该表格的记录也可以实现查看触发器功能。关于系统表triggers的表结构如下图所示。
四、学习任务4:删除触发器
触发器的操作包括创建触发器、査看触发器以及刪除触发器。本节将详细介绍如何删除触发器。在MySQL软件中可以通过两种方式来删除触发器,通过DROP TRRIGER语句来实现删除触发器。
通过drop triggers语句删除触发器
在MySQL中删除触发器通过SQL语句drop triggers来实现,其语法形式如下:
DROP TRIGGER trigger_name;
在上述语句中,trigger_name参数表示所要删除的触发器名称。