触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

创建触发器的语法如下:

DELIMITER ||
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo(所有者)
FOR EACH ROW
BEGIN
...

END ||
DELIMITER ;
  • trigger_name:触发器的名称
  • tirgger_time:触发时机,为BEFORE或者AFTER
  • trigger_event:触发事件,为INSERT、DELETE或者UPDATE
  • mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突。可用DELIMITER重新定义语句的结束符号。

在BEGIN...END语句中也可以定义变量,但是只能在BEGIN...END内部使用:

DECLARE var_name var_type [DEFAULT value] #定义变量,可指定默认值
SET var_name = value  #给变量赋值

NEW与OLD关键字:

  • NEW.columnname:新增行的某列数据
  • OLD.columnname:删除行的某列数据

例如,在user表中增加一个用户后,在log表中写一行日志:

DELIMITER $
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2);     #函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(s1);
END $
DELIMITER ;

限制和注意事项 编辑

  • 触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序,也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
  • 不能在触发器中使用以显示或隐式方式开始或结束事务的语句,如START TRANS-ACTION,COMMIT或ROLLBACK。
  • MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果是对非事务表进行操作,那么就无法回滚了,数据可能会出错。