触发器: trigger, 事先为某张表绑定好一段代码 ,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码,执行。
一、触发器有以下4种类型
1、监视地点(table)
2、事件类型:增删改, 三种类型insert,delete和update
3、触发时间:前后: before和after
4、触发对象:表中的每一条记录(行)
一张表中只能拥有一种触发时间的一种类型的触发器: 最多一张表能有6个触发器
6种触发器是:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
注:对于一个表相同触发时间的相同触发事件,只能定义一个触发器
触发器只能创建在永久表上,不能对视图、临时表创建触发器。
格式:
create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt;
trigger_name:触发器的名称,不能与已经存在的触发器重复;
trigger_time: 是触发器的触发事件【时间】,可以为before(在检查约束前触发)或after(在检查约束后触发)。
after:是先完成数据的增删改,然后再触发,触发的语句晚于监视的增删改,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品数量。当商品数量少于订单数量时造成爆库。
before: 先完成触发,在进行增删改,触发语句先于监视的增删改,我们就有机会判断,修改即将发生的操作。
trigger_event: 是触发器的触发事件,包括insert、update和delete,需注意对同一个表相同触发时间的相同触发事件,只能定义一个触发器。
MySQL 除了对 INSERT、UPDATE、DELETE 基本操作进行定义外,还定义了 LOAD DATA 和 REPLACE 语句
LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT 操作。
INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发。
UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发。
DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。
可以使用old和new来引用触发器中发生变化的记录内容。
tbl_name:该触发器作用在tbl_name上;
for each row: for each row如果不写,无论update语句一次影响了多少行,都只执行一次触发事件。 比如:1人下了订单,买了5件商品,insert 5次,可以用行级触发器,修改5次库存;用语句级触发器触发,insert一条发货提醒。
二、关于触发器中的 NEW 和OLD 说明
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据。
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据。
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据。
使用方法: NEW.columnName (columnName 为相应数据表某一列名)另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。
变量详
MySQL 中使用 DECLARE 来定义一局部变量,该变量只能在 BEGIN … END 复合语句中使用,并且应该定义在复合语句的开头,
三、触发器有如下作用
1、可维护数据库的安全性、一致性和完整性。
2、可在写入数据表前,强制检验或转换数据。
3、当触发器发生错误时,异常的结果会被撤销。
4、部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL 触发器,还可以针对视图定义替代触发器(INSTEAD OF)
触发器的优点:触发器可通过数据库中的相关表实现级联更改。从约束的角度而言,触发器可以定义比CHECK 更为复杂的约束。与CHECK 约束不同的是,触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的数据来比较更新的数据,以及执行其他操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表的状态,并根据其差异采取对策。一
个表中的多个同类触发器(INSERT、UPDATE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。
虽然触发器功能强大,可以轻松可靠地实现许多复杂的功能,但是它也具有一些缺点,滥用会造成数据库及应用程序的维护困难。在数据库操作中,可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时,规则、约束、缺省值也是保证数据完整性的重要保障。如果对触发器过分地依赖,那么势必会影响数据库的结构,同时增加了维护的复杂性。
三、对于触发器,需要特别注意以下几点内容
1、触发器在数据库里以独立的对象存储。
2、存储过程通过其他程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。
3、触发器被事件触发。运行触发器叫作触发或点火(FIRING),用户不能直接调用触发器。
4、触发器不能接收参数。