MySQL:触发器

1 触发器

  触发器是一种特殊的与表事件相关的存储过程,其执行不是由程序调用,也不是手工启动,而是由事件触发。触发器经常用于加强数据的完整性约束和业务规则等。也可以用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。MySQL中触发器的完整语法结构如下:

CREATE
    [DEFINER = user]
    TRIGGER [IF NOT EXISTS] trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
  • trigger_time: 指示触发器触发时间。before是指在执行触发语句之前激发触发器;after是指在执行触发语句之后激发触发器。
  • trigger_event: 指示触发事件。delete是指每当一个delete语句从表中删除一行时激活触发器;insert是指每当一个insert语句向表中插入一行激活触发器;update是指每当update语句修改指定列时激活触发器。
  • trigger_order: 这是一个可选参数。如果定义了多个具有相同触发事件和触法时间的触发器时,默认触发顺序与触发器的创建顺序一致。其中follows是指当前创建的触发器在现有触发器之后激活;precedes是指当前创建的触发器在现有触发器之前激活。
2 使用案例
2.1 说明
  • 首先,这里使用navicat来展示触发器的创建和使用。在navicat中触发器的创建方式如下:
    MySQL:触发器_第1张图片
    在navicat中,trigger_name、trigger_event、trigger_time可以直接设置不需要直接写代码,而trigger_body部分编写语句完成。举例如下:
    MySQL:触发器_第2张图片
  • 其次,该部分需要用到的数据库表如下:
    MySQL:触发器_第3张图片
2.2 具体案例
  • 当向score表中添加数据时,如果学生的学号与student表中的数据不匹配,则将此数据删除。(虽然这个使用外键来限制会更好,这里只是为了展示触发器的创建。)触发器的trigger_body部分如下:
BEGIN 
DECLARE stu_count INT; 
SELECT COUNT(*) INTO stu_count FROM student WHERE id=NEW.student_id; IF stu_count=0 THEN 
DELETE FROM score WHERE student_id=NEW.student_id; END IF; 
END

上述代码中的NEW代表新插入或更新的数据行(OLD表示被更新或删除的数据行的旧值)。
当执行插入语句并且触发了触发器时结果如下:
MySQL:触发器_第4张图片

参考资料
  1. https://zhuanlan.zhihu.com/p/158670286

你可能感兴趣的:(SQL,mysql,数据库)