12-MySQL数据库的触发器

发布时间 2023-07-30 22:05:46作者: ღ᭄遇见你²⁰²²

12-MySQL数据库的触发器

课程目标

了解触发器简介。

掌握MySQL触发器的创建和使用以及删除。

12.1触发器简介

触发器是一个被指定关联到一个表的数据库对象,当对一个表的特定事件(例如增、删、改、查表中记录)出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某些)MySQL语句在特定事件发生时自动执行。例如:

每当增加一个客户到数据库的客户基本信息表时,都检查其QQ号码的格式是否正确。

每当向客户销售一个产品时,都从产品库存量中减少库存的数量。

每当删除客户基本信息表中一个客户的全部基本信息数据时,该客户所订购的未完成订单信息也应该被自动删除。

无论何时删除一行,都在数据库的存档表中保留一个副本。

触发器与表的关系十分密切,用于保护表中的数据。当有操作影响到触发器所保护的数据时,触发器就会被自动执行,从而保障数据库中数据的完整性,以及多个表之间数据的一致性。

具体而言,触发器就是MySQL响应insert、update和delete语句而自动执行的一条MySQL语句(或位于begin和end语句之间的一组MySQL语句)。需要注意的是,其它MySQL语句是不支持触发器的。

12.2 触发器的创建和使用

1. 创建触发器的语法如下:

create trigger 数据库名.触发器名 触发时刻 触发事件on 表名

for each row 触发器的动作主体

语法说明如下:

1).关于触发器名:即触发器在所在数据库的唯一标识。

2).关于触发时刻:它有两个选项,即before和after,用于表示触发器是在激活它的语句之前或者之后触发。如果希望验证新数据是否满足使用的限制,则使用before选项;如果希望在激活触发器的语句执行之后完成几个或更多的改变,通常使用after选项。

3).关于触发事件:用于指定激活触发器的语句的种类,其可以是下述值之一:

①insert:将新行插入表时激活触发器。例如,通过MySQL的insert语句。

②update:更改表中某一行时激活触发器。例如,通过MySQL的update语句。

③delete:从表中删除某一行时激活触发器。例如,通过MySQL的delete语句。

4).关于表名:与触发器相关联的表名,必须引用永久性表,不能将触发器与临时表或视图关联起来。在该表上触发事件时才会激活触发器。同一个表不能拥有两个具有相同触发时刻和事件的触发器。例如,对于一张数据表,不能同时有两个before update触发器,但可以有一个before update触发器和一个before insert触发器,或一个before update触发器和一个after update触发器。

5).for each row:这个声明用来指定对于受触发事件影响的每一行都要激活触发器的动作。例如,使用一条insert语句向一个表中插入多地数据时,触发器会对每一行数据的插入都执行相应的触发器动作。

6).关于触发器的动作主体:即包含触发器激活时将要执行的MySQL语句。如果要执行多个语句,可使用begin…end复合语句结构。

注意,在触发器的创建中,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器,即每条insert、update和delete的之前和之后。单一触发器不能与多个事件或多个表相关联,例如,需要一个对insert和update操作执行的触发器,则应该定义两个触发器。

2.查看和使用触发器的语法如下:

show triggers [{from | in} 数据库表]

例:在数据库huike中的表emp中创建一个触发器t1,用于向表emp中插入一行数据的同时也向dept表中插入一行数据。

delimiter //

create trigger huike.t1 before insert on emp for each row

begin

insert into dept values(50,'HR','BEIJING');

end //

注:delimiter 符号,其功能是改变输入结束符。在MySQL中默认的语句输入结束符是“;”,现在通过delimiter语句将默认的输入结束符“;”修改为“//”。

12.3 触发器的删除

和删除数据库、删除表格一样,删除触发器的语法如下:

drop trigger [IF EXISTS] 数据库名.触发器名

例:删除数据库huike中的表emp中的触发器t1。

delimiter //

drop trigger huike.t1

end //

12.4 本章小结

本章主要阐述了MySQL数据库中的触发器。