Skip to content
生如风生如风
主页
github icon
  • 触发器
    • 简介
      • NEW和OLD
        • 例子

        Mysql—触发器

        author icon生如风calendar icon2023年2月10日category icon
        • Mysql
        tag icon
        • 触发器
        timer icon大约 4 分钟

        此页内容
        • 触发器
          • 简介
          • NEW和OLD
          • 例子

        [TOC]

        # 触发器

        # 简介

        触发器用于直接在某种操作后(数据的增删改查等),通过事件执行设置触发器时的 sql 语句,具有原子性。 可通过 sql 语句直接编写,关键词:CREATE TRIGGER 触发器名称。 例如:在表 student 上,创建触发器 test (CREATE TRIGGER test),在新增一行数据之后(AFTER INSERT),根据 student 的 classId ,在表 class 中,找到 id 所在行,设置 number + 1。

        DELIMITER $$
        $$
        CREATE TRIGGER `test`
        AFTER INSERT
        ON student FOR EACH ROW
        BEGIN 
        	UPDATE class set number = number + 1 WHERE id = NEW.classId;
        END
        $$
        DELIMITER ;
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10

        后面方便,直接使用 Dbeaver 创建触发器

        # NEW和OLD

        这两个关键词是 mysql 设定的两张临时表名

        触发器NEWOLD
        insert表示将要(BEFORE)或者已经(ALTER)插入的数据×
        delete×表示将要(BEFORE)或者已经(ALTER)删除的数据
        update表示将更新后的数据表示更新前的数据

        # 例子

        新建表 学生student 、班级class

        student表

        class表

        # insert

        • AFTER INSERT,插入之后触发 如:新增一名学生,对应班级number + 1 1、创建触发器:

        • 创建触发器1

        • 创建触发器2

        • 触发器内容

          sql 语句写于BEGIN 和 END 之间。因为是在student 表上的插入后触发ALTER INSERT ,我们要更新 class 表,设置number 列的值+1,条件是student 插入数据后,新的student临时表(NEW)的classId,等于= class表的 id 。

        执行

        2、执行后:

        执行后

        3、测试: 在表student 新增一个学生,学生的classId,指定是class 表的火箭班的id=3

        插入数据

        这时候查看class 表,是否火箭班对应的number变为了1

        查看结果

        • BEFORE INSERT,插入之前触发 如:新增一名学生前,先查询该学生名称如果是“小六”,则提示“请输入正确的姓名!” 从MySQL 5.5开始,您可以使用SIGNAL语法抛出异常:
        signal sqlstate '45000' set message_text = 'My Error Message';
        
        1

        状态45000是表示"未处理的用户定义的异常"的通用状态

        1、创建触发器:

        在这里插入图片描述

        2、测试: 添加名为“小六”的学生失败

        在这里插入图片描述

        正常添加一个学生:

        在这里插入图片描述

        到这里,目前存在了两个触发器在student表中

        在这里插入图片描述

        mysql中,执行顺序:BEFORE触发器->增删该操作->ALTER触发器 所以在经过addStudent BEFORE INSERT 触发器判断后,将要插入student 的数据,也会经过addClassNumber 触发器, 在class 的number + 1

        在这里插入图片描述

        # delete

        • AFTER DELETE 如:删除一名学生之后,class 表对应的 班级number - 1 1、创建触发器

        • 在这里插入图片描述

          2、测试: 删掉普通班的王五和赵六

          在这里插入图片描述

          现在普通班只剩下1人张三

          在这里插入图片描述

        • BEFORE DELETE 如:删除相应的班级之前,查询该班是否还有学生,如果有,就提示无法删除 1、在class 上创建触发器

        • 在这里插入图片描述

        • 在这里插入图片描述

          2、测试: 删除普通班

          在这里插入图片描述

          删除重点班:

          在这里插入图片描述

        # update

        关于update的就不多说了,可以在更新学生student 表的classId后,也在class 表的对应班级number + 1基本的逻辑都类似,更多的是根据业务来选择及编写触发器。

        在这里插入图片描述

        测试:

        在这里插入图片描述

        在这里插入图片描述

        写到这里,暂时完成了触发器的简单使用。后续有需要在继续更新上来。

        可以看看我的个人博客: 网站:https://www.fuzm.wangopen in new window / https://liwangc.gitee.ioopen in new window ————————————————————————— 作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。

        默认页脚
        Copyright © 2026 生如风