MySQL之触发器
作者:mmseoamin日期:2023-12-21

文章目录

  • MySQL触发器
    • 什么是触发器
    • 为什么使用触发器
    • 创建触发器
      • 添加事件
      • 删除事件
      • 修改事件
      • 删除触发器
      • 触发器的应用场景

        MySQL触发器

        什么是触发器

        • MySQL触发器(Trigger)是一种特殊的存储过程,
        • 它与表有关,当表上的特定事件(insert,update,delete)发生时,触发器会自动执行。
        • 可以使用触发器来实现数据约束,数据验证,数据复制等功能

          为什么使用触发器

          • 可以实现数据约束,数据验证,数据复制等功能
            • 例如:
              • 可以创建一个触发器,在向表中插入一条记录时,自动向另一个表中插入一个记录,从而实现数据复制的功能。
              • 触发器还可以用于实现数据验证,
                • 例如
                  • 在插入或更新数据时,检查记录的某些字段是否符合要求,则拒绝插入或者更新,这样可以保证数据的完整性和一致性。

                    创建触发器

                    语法:

                    create trigger 触发器名称
                    {before | after } {insert | update | delete}  -- 触发器类型和事件
                    on 表名称
                    for each row  -- 触发器的作用范围
                    begin
                        -- 触发器执行的操作
                    end;
                    
                    • 触发器名称可以自定义 ,并唯一性,见名知意
                    • before / after : 表示触发器的类型,分别表示发生前/发生后执行
                    • insert / update / delete : 表示触发器的事件类型,分别表示插入 / 更新 / 删除操作
                    • on 表名称 : 为触发器所在的表名
                    • for each row : 表示触发器作用的范围,即每一行记录都会触发该触发器
                    • begin 和 end之间是触发器执行的操作,可以是一条或者多条SQL语句
                    • 触发器是自动执行的,无需手动调用,
                    • 当表上的特定事件(insert , update, delete ) 发生时,触发器会自动执行
                    • 在创建触发器时,可以定义触发器的类型和事件,从而控制触发器的时机和条件

                      案例:

                      -- 创建两张表
                      create table table1(
                          id int,
                          name varchar(20) character set utf8
                      )charset = utf8;
                      create table table2(
                          id int,
                          name varchar(20) character set utf8
                      )charset = utf8;
                      

                      添加事件

                      -- 创建一个触发器,当向表中插入一条记录时,自动向另一个表中插入一条记录
                      create trigger insert_trigger_1
                      after insert on table1
                          for each row
                          begin
                              -- 触发器的具体事件
                              insert into table2(id,name) values (NEW.id,New.name);
                          end;
                      

                      添加数据:

                      向table1表中添加数据时,会触发insert_trigger_1触发器,自动向table2表中添加数据

                      insert into table1(id,name) values (1,'张三'),(2,'李四'),(3,'王五'),(4,'赵六'),(5,'唐七'),(6,'老王');
                      

                      查询table1表

                      select * from table1;
                      

                      MySQL之触发器,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t7WwUqs3-1682412065268)(E:\Java笔记\数据库\MySQL触发器.assets\image-20230425163444783.png)],第1张

                      查询table2表

                      select * from table2;
                      

                      MySQL之触发器,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f8dDGXuG-1682412065269)(E:\Java笔记\数据库\MySQL触发器.assets\image-20230425163459492.png)],第2张

                      删除事件

                      -- 创建一个触发器,当从表中删除一条记录时,自动从另一个表中删除一条记录
                      create trigger delete_trigger_1
                       after delete on table1
                          for each row
                          begin
                              delete from table2 where id = OLD.id and name = OLD.name;
                          end;
                      

                      删除数据:

                      删除table1表中数据时,会触发delete_trigger_1触发器,自动删除table2表中对应的数据

                      delete from table1 where id = 5 and name = '王五';
                      

                      查看两张表中的数据

                      select * from table1;
                      

                      MySQL之触发器,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OmMCyZU1-1682412065270)(E:\Java笔记\数据库\MySQL触发器.assets\image-20230425163700451.png)],第3张

                      select * from table2;
                      

                      MySQL之触发器,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8227mnW-1682412065270)(E:\Java笔记\数据库\MySQL触发器.assets\image-20230425163647831.png)],第4张

                      修改事件

                      -- 创建一个触发器,当向表中更新一条记录时,自动更新另一个表中的记录
                      create trigger update_trigger_1
                      after update on table1
                          for each row
                          begin
                              update table2 set id = NEW.id, name = NEW.name  where id = OLD.id and name = OLD.name;
                          end;
                      

                      修改数据:

                      修改table1表中数据时,会触发update_trigger_1触发器,自动更新table2表中对应的数据

                      update table1 set id = 10,name = '小明' where id = 6 and name = '老王';
                      
                      select * from table1;
                      

                      MySQL之触发器,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Jfom32U-1682412065271)(E:\Java笔记\数据库\MySQL触发器.assets\image-20230425163852532.png)],第5张

                      select * from table2;
                      

                      MySQL之触发器,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eN3drNe4-1682412065271)(E:\Java笔记\数据库\MySQL触发器.assets\image-20230425163907569.png)],第6张

                      删除触发器

                      drop trigger 触发器名称;
                      

                      触发器的应用场景

                      触发器的应用场景包括但不限于以下几种:

                      1. 强制实施业务规则:通过在触发器中编写逻辑,可以在特定的表上自动执行业务规则,例如检查输入的数据是否符合要求,或者限制某些操作的执行。
                      2. 记录日志变更:通过在触发器中编写逻辑,可以在特定的表上自动记录数据的变更情况,例如记录数据的修改时间、修改人等信息。
                      3. 复杂的默认值计算:通过在触发器中编写逻辑,可以在特定的表上自动计算默认值,例如根据其他字段的值计算出一个新的字段的值。
                      4. 数据同步:通过在触发器中编写逻辑,可以在多个表之间自动同步数据,例如在一个表中插入一条数据时,自动在另一个表中插入相应的数据。
                      5. 数据校验:通过在触发器中编写逻辑,可以在特定的表上自动校验数据的正确性,例如检查数据的唯一性、完整性等。

                      总结:

                      触发器的应用场景非常广泛,可以用于强制实施业务规则、记录日志变更、复杂的默认值计算、数据同步以及数据校验等。在创建触发器时,需要指定触发器的名称、触发器所在的表、触发器的触发时机(如insert、update或delete操作)、触发器的执行次数(for each row或for each row statement)以及触发器的逻辑。