触发器

mysql触发器详解

什么是触发器?

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

触发器是基于行触发得,所以删除,修改以及增加都会可能激活触发器,所以不要编写过于复杂得触发器,

触发器得作用:

  • 安全性
  • 审计
  • 实现复杂得数据完整性规则
  • 实现复杂得非标准得数据库相关完整性规则
  • 同步实时得复制表中得数据
  • 同时计算数据值
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:触发器的名称
tirgger_time:触发时机,为BEFORE或者AFTER
trigger_event:触发事件,为INSERT、DELETE或者UPDATE
tb_name:表示建立触发器的表明,就是在哪张表上建立触发器
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
所以可以说MySQL创建以下六种触发器:
BEFORE INSERT,BEFORE DELETE,AFTER UPDATE

其中,触发器名参数指要创建的触发器的名字

BEFORE和AFTER参数指定了触发执行的事件,在事件之前或者之后

FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器

创建多个执行语句的触发器

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
    执行语句列表
END

tips:一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突

   为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||

   当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;

mysql> DELIMITER ||
mysql> CREATE TRIGGER demo BEFORE DELETE
    -> ON users FOR EACH ROW
    -> BEGIN
    -> INSERT INTO logs VALUES(NOW());
    -> INSERT INTO logs VALUES(NOW());
    -> END
    -> ||
Query OK, 0 rows affected (0.06 sec)
mysql> DELIMITER ;

image-20200803170151391

中间定义的变量

image-20200803170603201

实例,在user表中插入数据,就会在logs表中生一条日志

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 ;
posted @ 2020-09-06 18:34  且I听  阅读(56)  评论(0)    收藏  举报