目录
一、说明
这里只是一个简单的示例。
假设系统中有两个表:
班级表 class、学生表 student
准备数据:
班级表(班级id、班级名称、学生数量)
学生表(学生id、学生姓名、班级id)
二、需求
学生表每增加一个学生,所对应班级表中的班级学生数量增加1。
上才艺:
-- 创建触发器名称
create trigger update_stuCount
-- 触发时机(before 或 after),即做某件事之前触发,还是之后触发
after
-- 触发事件(insert、update、delete),即做什么事触发
insert
-- 建立触发器的表名,即给哪张表创建触发器
on student
-- 是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作
for each row
-- 触发器程序体,可以是一句SQL语句,或者用begin和end包含的多条语句(示例这里是多条语句,所以用的是begin和end包裹)。
begin
-- 定义变量: 学生数量
declare count int;
-- 查询 班级表 学生数量 (根据 学生表新插入学生数据的班级id 进行查询) 并 将查询出的学生数量 赋值给 变量 count
-- new.class_id 就是学生表中 插入数据的 class_id
set count = (select stu_count from class where class_id = new.class_id);
-- 更新 班级表 学生数量字段值 (学生表每插入一条则 将班级原始学生数量加1) 根据 学生表新插入数据的班级id进行更新
-- new.class_iD 就是学生表中 插入数据的 class_id
update class set stu_count = count + 1 where class_id = new.class_id;
end
三、描述
3.1. for each row
是指每行受影响,触发器都执行,叫行级触发器。oracle触发器中分行级触发器和语句级触发器,可不写for each row,无论影响多少行都只执行一次。mysql不支持语句触发器,所以必须写for each row;
3.2. 修改和删除
若要修改触发器可以先删除 后创建
3.3. 注意
删除一个表的同时,也会自动删除该表上的触发器。另外,触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,再重新创建。
-- 删除:drop trigger update_stuCount
-- 创建:create trigger update_stuCount ......