第46讲:MySQL的触发器

2023年 12月 26日 43.7k 0

触发器介绍

在开发中,我们经常会遇到有两个或多个相互关联的表,如商品信息和库存信息分别存放在两个不同的数据表中。

添加一条商品记录就要同时添加一条库存记录。这种可以使用触发器,让添加商品信息时自动插入一条库存信息。

这样可以保证数据的完整性,不用担心因为忘记添加库存数据而导致数据缺失。

MySQL从5.0.2开始支持触发器。它和存储过程一样,都是嵌入MySQL服务器的一段程序。

触发器是由事件触发某个操作,这些事件包括insert、update、delete事件。如果定义了某个触发程序,当数据库执行这些语句,就会触发那段程序。

当对数据表中的数据进行操作时,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

创建触发器

创建触发器,语法:

    create trigger 触发器名称


    [before|after] [insert|update|delete] on 表名


    for each row


    触发器执行的语句块;

    说明:

    表名:表示触发器监控的对象。

    before|after:表示触发的时间。before表示在事件之前触发;after表示在事件之后触发。

    insert|update|delete:表示触发的事件。

    insert表示插入记录时触发。

    update表示更新记录时触发。

    delete表示删除记录时触发。

    触发器执行的语句块:可以是单条SQL语句,也可以是由begin...end结构组成的复合语句块。

    创建before触发器,举栗子:

    创建表

    创建触发器

      #创建触发器,插入test_trigger时往test_trigger_log插入记录
      delimiter
      create trigger before_insert_test_tri
      before insert on test_trigger
      for each row
      begin
      insert into test_trigger_log(t_log) values('开始 插入');
      end
      delimiter ;

      验证触发器,插入数据时,自动触发触发器,往日志表中插入数据。

      创建after触发器,举栗子:

      创建触发器

        delimiter
        #删除test_trigger的数据,往日志表中插入
        create trigger after_delete_test_tri
        after delete on test_trigger
        for each row
        begin
        insert into test_trigger_log(t_log) values('开始删除');
        end
        delimiter ;

        验证删除数据后,日志表中自动添加了一条删除日志的记录。

        处理业务逻辑,举栗子:

        创建触发器,添加员工要检查新员工的薪资是否大于他领导的薪资。如果大于领导薪资,则报sqlstate_value为'HY000'的错误,从而添加失败。

          delimiter //
          create trigger add_emp_tri
          before insert on employees
          for each row
          begin
          #声明变量,领导的工资
          declare mgr_sal double;
          #获取领导的工资
          select salary into mgr_sal from employees
          where employee_id =NEW.manager_id;
          #判断
          if NEW.salary >mgr_sal
          then signal sqlstate 'HY000'
          set message_text='薪资高于领导薪资错误';
          end if;
          end //
          delimiter ;

          验证,查询员工表的表结构

          找一个当领导

          添加一个新员工,工资8000,小于领导的工资可以添加成功。

          添加一个新员工,工资20000,大于领导的工资添加失败。

          查看触发器

          查看触发器是查看数据库中已经存在的触发器的定义、状态和语法信息等。

          方式1:查看当前数据库的所有触发器定义

            show triggers;

            方式2:查看当前数据库中某个触发器的定义

              show create trigger 触发器名

              方式3:从系统库information_schema的triggers表中查询某个触发器的信息。

                select * from information_schema.triggers;

                查看触发器,举栗子:

                查看当前数据库的所有触发器定义

                查看当前数据库中某个触发器的定义

                从系统库information_schema的triggers表中查询某个触发器的信息。

                删除触发器

                使用drop删除,可以加if exists 判断存在就删除,避免报错。

                总结

                触发器的优点:

                保证数据的完整性

                记录操作日志

                操作数据前,对数据进行合法性的校验。

                触发器的缺点:

                触发器可读性差,隐蔽性强。看上去只是执行了一个update的操作,其实还执行了触发器里面的程序。

                相关数据的变更,可能会导致触发器出错。触发器中使用的表结构变更,会导致触发器报错,影响到数据操作的正常运行。

                注意点,因为外键导致表数据变更,触发器是不会触发的。

                推荐阅读书籍

                相关文章

                Oracle如何使用授予和撤销权限的语法和示例
                Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
                下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
                社区版oceanbase安装
                Oracle 导出CSV工具-sqluldr2
                ETL数据集成丨快速将MySQL数据迁移至Doris数据库

                发布评论