CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
TRIGGER:触发器关键字
trigger_name:触发器名称
trigger_time:触发时机(BEFORE或AFTER)
trigger_event:触发事件(INSERT、UPDATE 或 DELETE)
tbl_name:建立触发器的表名
FOR EACH ROW: 每行受影响,触发器都执行,叫行级触发器。 Oracle触发器中,分行级触发器和语句触发器,可不写FOR EACH ROW,即无论影响多少行都只执行一次。 mysql不支持语句触发器,所以必须写FOR EACH ROW
trigger_stmt:触发器程序体,可以是一句SQL语句或者用BEGIN和END包含的多条语句。
注:
不能在一个表上建立两个相同类型的触发器。触发器类型有:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
在MySQL中,还定义了LOAD DATA 和 REPLACE 语句。
LOAD DATA 语句将一个文件装入到一个数据表中,相当于一系列的INSERT操作。
REPLACE 语句当数据发生替代,即当插入的数据和原来的数据的主键或唯一索引相同时,会先把原先的数据删除,再插入一条新的数据。
INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。
BEGIN
[statement_list]
END
解释:
statement_list代表一个或多个语句,以分号(;)结尾,这个与MySQL中分号是语句结束符相冲突,所以需要用DELIMITER命令修改分隔符。语法如下:
DELIMITER new_delemiter
new_delemiter 可以设为一个或多个长度的符号,默认的是分号(;)
假设系统中有两个表:
班级表 class(班级号 classID, 班内学生数 stuCount)
学生表 student(学号 stuID, 所属班级号 classID)
要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:
DELIMITER $
create trigger tri_stuInsert after insert
on student for each row
begin
declare c int;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;
declare 定义局部变量,该变量只能在BEGIN...END符合语句中使用,并且定义在开头。语法如下:
DECLARE var_name[,...] type [DEFAULT value]
其中:
var_name 为变量名称
DEFAULT value 默认值为NULL
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
注:
OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。
SHOW TRIGGERS [FROM schema_name];
其中,schema_name 即 Schema 的名称,在 MySQL 中 Schema 和 Database 是一样的,也就是说,可以指定数据库名,这样就不必先“USE database_name;”了。
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
我们建立的数据库一般都是 InnoDB 数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:
①如果 BEFORE 触发器执行失败,SQL 无法正确执行。
②SQL 执行失败时,AFTER 型触发器不会触发。
③AFTER 类型的触发器执行失败,SQL 会回滚
附参考原文:
https://www.cnblogs.com/duodushu/p/5446384.html