由于公司业务需求,了解这方面业务,进行总结和查询资料的记录。
在执行某条语句,在事件发生时自动执行。
触发器是mysql响应以下任意语句而自动执行的一条mysql语句(或位于begin和end语句之间的一组语句)
delete
insert
update
其他的mysql语句不支持
创建触发器时最少四条信息
1.唯一的触发器名
2.触发器关联表
3.触发器应该响应的活动(delete/insert或update)
4.触发器何时执行(处理之前或之后)
保持每个数据库的触发器名唯一。在mysql5中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一。这表示同一个数据库中的两个表可具有相同名字的触发器。这在其他每个数据库触发器必须唯一的dbms中是不允许的。而且以后的mysql版本可能会使用规则更为严格。因此,现在最好是在数据库方位内使用唯一的触发器名
触发器用create trigger语句创建。下面是一个简单的例子:
输入
create trigger newproduct after insert on products
for each row select 'Product added'
分析
create trigger用来创建名为newproduct的新触发器。触发器可在一个操作发生之前或之后执行,这里给出了after insert
所以此触发器将在insert语句成功执行后执行。这个触发器还制定for each row,因此代码对每个插入行执行。在这个例子中
文本product added将对每个插入的行显示一次
为了测试这个触发器,使用insert语句添加一行或者多行到products中,你将看到对每个成功的插入,显示Product added
消息
仅支持表:只有表才支持触发器,视图不支持(临时表也不支持)
触发器按每个表每个时间每次地定义,每个表每个事件每次只允许一个触发器因此,每个表最多支持6个触发器(每条insert/
update和delete的之前和之后。单一触发器不能与多个事件或多个表关联,所以,如果你需要一个insert和update操作执行
的触发器,则应该定义两个触发器
触发器失败: 如果before触发器失败,则mysql将不执行请求的操作。此外,如果before触发器或语句本身失败,mysql将
不执行after触发器(如果有的话)
删除触发器
输入
DROP trigger newproduct
触发器不能更新或覆盖,为了修改一个触发器,必须先删除他,然后在重新创建
错误-
[Err] 1415 - Not allowed to return a result set from a trigger
由于返回的是结果集 SELECT 'Product added';
需要在后面加入into @args; 才可以运行测试on
1303 can t create a trigger from within another stored routine
无法从另一个存储例程中创建触发器。