MySQL

MySQL 知识量:16 - 40 - 165

12.1 触发器><

什么是触发器- 12.1.1 -

MySQL语句通常由明确的指令决定是否执行,但是,如果想要某条语句在某些事件发生时自动执行该怎么办呢?例如:如果删除一个表中的一行,就自动在另一个表中记录删除的内容。这种情况下,就可以使用触发器。

触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于begin和end之间的一组语句):

  • delete

  • insert

  • update

注意:其他MySQL语句不支持触发器。

创建触发器- 12.1.2 -

创建触发器时,需要给出以下信息:

  • 触发器名称,必须唯一。

  • 触发器关联的表。

  • 触发器应该响应的活动(delete、insert或update)。

  • 触发器何时执行(活动发生之前或之后)。

注意:触发器的名称必须确保在每个表中是唯一的,目前不要求在数据库中唯一,但是以后可能会修改为在数据库中也必须唯一,为了今后的可移植性和适应性,最好确保在整个数据库中,触发器的名称也是唯一的。

下面创建一个触发器report_people:

create trigger report_people 
after insert 
on people 
for each row 
select 'people added!' into @mark;

以上SQL语句中,具体语法如下:

  • create trigger用于创建一个触发器,名称为report_people。

  • after insert表示在插入操作后触发。

  • on表示触发器应用在哪个表上。

  • for each row表示对每行插入都执行。

  • select...into语句是触发器实际会执行的动作,它将在触发器触发时向变量@mark中写入“people added!”。

特别注意:MySQL的触发器不能直接返回结果集,但可以将结果保存在一个变量中,例如上面的@mark。

下面向表people中插入一行数据:

insert into people(realName,realAge,sex) values('Credy',23,'male');

查询变量@mark中的内容:

select @mark;

结果为:

+---------------+
| @mark         |
+---------------+
| people added! |
+---------------+

只有表才支持触发器,视图和临时表都不支持。触发器按每个表每个事件每次来定义,每个表每个事件每次只允许一个触发器,因此,每个表最多支持6个触发器(即每条delete、insert和update的之前和之后)。单一触发器不能与多个事件或多个表关联。

触发器由before和after关键字来标识是事件之前执行还是之后执行。如果before触发器执行失败,则MySQL将不执行触发器关联的SQL语句。如果before触发器或SQL语句本身执行失败,MySQL将不执行after触发器。

删除触发器- 12.1.3 -

删除触发器使用drop trigger语句。例如删除触发器report_people:

drop trigger report_people;

触发器不能更新或覆盖,要修改一个触发器,必须先删除它,然后重新创建。