数据库中除了需要定时完成一些任务外,有时我们也想在某些表数据变化时自动执行些操作,这就要用到触发器了
基本语法
-- 删除已有同名触发器
DROP TRIGGER IF EXISTS trigger_name;
-- 创建新触发器
CREATE TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name
FOR EACH ROW
BEGIN
trigger_stmt;
END;
其中:trigger_name:标识触发器名称,用户自行指定;trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。
触发条件
INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。
简单例子
如果设置 或定义变量 要按照一下的格式写
比如修改数据前 修改要插入的数据
1 | delimiter $$ |
定义变量
mysql存储过程中,定义变量有两种方式:
1.使用set或select直接赋值,变量名以 @ 开头.
例如:
1
set @var=1;
可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量。
2.以 DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如:
1
2DECLARE max_rank INT DEFAULT 0;
set max_rank = (select max(rank) from user );主要用在存储过程中,或者是给存储传参数中。
两者的区别是:
在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,之后在会话内都是对上一次计算的结果,就相当于在是这个会话内的全局变量。
在存储过程中,使用动态语句,预处理时,动态内容必须赋给一个会话变量。
例:
1 | set @v_sql= sqltext; |
NEW 与 OLD
上述示例中使用了 NEW 关键字
MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。
具体:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
if else
1 | declare stu_grade float; |
查看触发器
1 | SHOW TRIGGERS; |