mysql触发器trigger使用


所谓 trigger 就是 mysql 中的一个触发器,触发器的主要作用是在执行 mysql 之前或者之后来执行一些特定的操作。简单记录下使用方法。


操作规则

主要针对的 mysql 操作:insert、update、delete。

触发的时间设定是: before (sql 执行前)、after(sql 执行之后)。

示例

示例语句

1
2
3
4
5
CREATE triggername AFTER INSERT ON tablename FOR EACH ROW  
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
SELECT OLD.id FROM tablename;
END;

示例含义

创建一个 名为triggername的触发器,在tablename表插入数据之后执行,查找原有的 id,作用于每一行操作。

并且忽略掉触发器的 sql 错误,也就是触发器与原sql 互不影响。

示例详解

1
CREATE triggername

创建一个 名为triggername的触发器。

1
2
AFTER INSERT  
ON tablename

在 insert 之后 执行, 这里我们也可以用 BEFOR ,在insert之前,同时操作类型也支持 update 和 delete。
也就是 AFTER|BEFORE INSERT|DELETE|UPDATE

并作用于 tablename 这张表

1
2
BEGIN  
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;

开始一系列操作的语句,通常我们要执行一组sql 的时候 会用到 begin end 语法。

声明 trigger 和其作用到的 sql 语句互相独立。
因为对于 trigger 而言 ,所要执行的 sql 语句和 trigger 相当于是在同一个事务内。
也就是说 sql 执行成功则执行 trigger 。同理若 trigger 执行失败了,则原sql也不会成功执行,会进行回滚。
有时候 trigger 是在业务已经完善之后要加的一些操作,为了避免影响到原有的 sql 执行,所以加了这一声明,来忽视 trigger可能遇到的的错误。
若 sql 执行成功,trigger 执行不成功的时候,自动忽略trigger 内的错误。不要影响到原有 sql。
DECLARE 具体写法参考:
参考地址

1
2
SELECT OLD.id FROM tablename; 
END;

执行要触发的语句 这里是查找出原有 sql 的 id 。如果是打印执行后的 id 则是 NEW.id。这里用 OLD 和 NEW 分别表示执行前和执行后的状态。

结束执行语句

删除 trigger

1
DROP TRIGGER triggername;

注意事项

如果是在 sql 命令行执行的话, 注意执行语句前要先执行

DELIMITER //

因为 sql语句是以 ; 分隔的。而DELIMITER主要是将复合的sql语句作为一条语句一次性执行。