触发器(trigger):当对数据库进行修改时,自动被系统执行的语句。
常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。
after(for):表示执行代码后,执行触发器
instead of:表示执行代码前,用已经写好的触发器代替你的操作
语法:
create trigger trigger_name tigger_time trigger_event on tbl_name
for each row trigger_stmt
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:SQL语句(单独一句/复合)。
示例:
假设系统中有两个表:
班级表 class(班级号 classID, 班内学生数 stuCount)
学生表 student(学号 stuID, 所属班级号 classID)
要创建触发器来使班级表中的班内学生数随着新数据插入学生表中而自动增加,代码如下:
create trigger tri_stdist 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
注:
实例中使用了关键字NEW,在mysql中还有关键字OLD,都是用来表示触发了触发器的那一行数据,两个关键字的具体区别如下:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
用法:NEW.columnName(OLD.columnName),columnName为表某一列名。另外,OLD是只读的,NEW可以通过触发器SET赋值(防止再次触发触发器,造成循环调用)。
查看触发器:SHOW TRIGGERS [FROM schema_name];
删除触发器:DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name