MySQL 知识量:16 - 40 - 165
MySQL语句通常由明确的指令决定是否执行,但是,如果想要某条语句在某些事件发生时自动执行该怎么办呢?例如:如果删除一个表中的一行,就自动在另一个表中记录删除的内容。这种情况下,就可以使用触发器。
触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于begin和end之间的一组语句):
delete
insert
update
注意:其他MySQL语句不支持触发器。
创建触发器时,需要给出以下信息:
触发器名称,必须唯一。
触发器关联的表。
触发器应该响应的活动(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触发器。
删除触发器使用drop trigger语句。例如删除触发器report_people:
drop trigger report_people;
触发器不能更新或覆盖,要修改一个触发器,必须先删除它,然后重新创建。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6