简述触发器
MySQL触发器可以理解为是一个监听器或一个事件,一旦表中的数据有变化,就会触发一个事件,执行该事件内的逻辑代码。
- 可以激活触发器的操作:INSERT、UPDATE、DELETE(查询操作不会激活触发器)
- 可以设置激活触发器的时刻:before(在操作执行之前激活)、after(在操作执行之后激活)
创建或删除触发器
# 创建
create trigger trigger_name before/after insert/update/delete on table_name for each row sql语句
例如:
# 每次在test表插入数据前 都往test2表内插入一条数据(名字:小明,性别:男,年龄:18)
create trigger test_trigger before insert on test for each row insert into test2 values(null, '小明', '男', 18);
# 删除
drop trigger trigger_name
图解创建语句
NEW与OLD的使用
NEW.col_name是获取当前触发器要操作的表内列的新值,比如insert会往表的列中插入新值,update会更新新值到表的列中。这些新值都是可以在触发器中使用的,但是得加上NEW标明要使用这个值。
OLD.col_name同理,触发器操作列中的旧值。
- INSERT操作只能使用NEW,不能使用OLD。
- UPDATE操作在before情况下能使用NEW和OLD,在after情况下只能使用NEW。
- DELETE操作只能使用OLD,不能使用NEW。
INSERT
如果插入的学生的年龄小于18 则年龄为18
create trigger student_insert_trigger
before/after insert on student
for each row
SET NEW.age = IF(NEW.age < 18, 18, NEW.age);
UPDATE
如果在更新前 新年龄小于18,则使用旧年龄更新进去(值不变),否则使用新年龄更新进去。
create trigger student_update_before_trigger
before update on student
for each row
SET NEW.age = IF(NEW.age < 18, OLD.age, NEW.age);
如果在更新后 新年龄大于100,则新年龄强制等于100。
create trigger student_update_after_trigger
before update on student
for each row
SET NEW.age = IF(NEW.age > 100, 100, NEW.age);
DELETE
删除一个学生,学生对应的班级人数减一。
create trigger student_delete_trigger
before delete on student
for each row
update grade set count = count - 1 where grade_id = old.grade_id
博主的博客网站:https://www.lollycode.com
觉得不错,点个赞再走呗!