• MYSQL中的触发器TRIGGER


    1.概念

    触发器是一个特殊的存储过程,当触发器保护的数据发生变更时就会触发。

    2.特性


    1.触发器与表息息相关,一般我们一个表创建六个触发器。

    2.六个触发器其实是三种类六个

    insert     类型 

      before | after    insert
    update   类型   before | after    update
    delete    类型   before | after    delete

       当我们进行这三个操作时,启动触发器。

    3.触发器写法

    1. CREATE TRIGGER trigger_name trigger_time trigger_event
    2.  ON table_name
    3.  FOR EACH ROW
    4.  BEGIN
    5.  ...
    6.  END

    4.创建触发器(实例,代码可操作)

    创建一个学生表和学生详情表

    1. -- 创建数据库
    2. CREATE DATABASE IF NOT EXISTS Test;
    3. -- 使用数据库
    4. USE Test;
    5. -- 创建表
    6. CREATE TABLE IF NOT EXISTS student (
    7. id INT PRIMARY KEY,
    8. name VARCHAR(255),
    9. age INT
    10. );
    11. -- info详细表
    12. CREATE TABLE stu_detail (
    13. id INT PRIMARY KEY,
    14. stu_id INT,
    15. name VARCHAR(50),
    16. age INT,
    17. address VARCHAR(100),
    18. phone VARCHAR(20)
    19. );
    20. -- 向student表中插入多条记录
    21. INSERT INTO student (id, name, age)
    22. VALUES (1, 'John', 25),
    23. (2, 'Jane', 28),
    24. (3, 'Mike', 30),
    25. (4, 'Sarah', 22);
    26. -- 向student表中插入多条记录
    27. INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
    28. VALUES (1, 1, 'John', 25, '123 Main St', '123-456-7890');
    29. INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
    30. VALUES (2, 2, 'Jane', 28, '456 Elm St', '987-654-3210');
    31. INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
    32. VALUES (3, 3, 'Mike', 30, '789 Oak St', '555-123-4567');
    33. INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
    34. VALUES (4, 4, 'Sarah', 22, '789 Oak St', '555-123-4567');

    创建BEFORE INSERT触发器

    该触发器作用为:插入student表时,先检查id是否存在,假如存在的话就回滚操作,并给出异常提醒,不存在才可以插入

    1. DELIMITER //
    2. CREATE TRIGGER before_insert_Student
    3. BEFORE INSERT ON student
    4. FOR EACH ROW
    5. BEGIN
    6. DECLARE idExists INT;
    7. SET idExists = (SELECT COUNT(*) FROM student WHERE id = NEW.id);
    8. IF idExists > 0 THEN
    9. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入ID已经存在,不允许插入';
    10. END IF;
    11. END//
    12. DELIMITER ;

     测试触发器 

    id冲突

     id不冲突

     创建AFTER UPDATE触发器

    改触发器功能为:

     after update 触发器,当student数据update时,stu_detail表中对应id的记录也随之变更

    1. -- update 触发器
    2. CREATE TRIGGER after_update_student
    3. AFTER UPDATE ON student
    4. FOR EACH ROW
    5. BEGIN
    6. UPDATE stu_detail
    7. SET name = NEW.name, age = NEW.age
    8. WHERE id = NEW.id;
    9. END;

    测试触发器

    更改成功

     

    查看detail表是否自动变更(可发现成功更改)

     创建 AFTER DELETE触发器

    1. CREATE TRIGGER after_delete_student
    2. AFTER DELETE ON student
    3. FOR EACH ROW
    4. BEGIN
    5. DELETE FROM stu_detail WHERE id = OLD.id;
    6. END;

    最后一个我就不测试了,交给大家去检测一下。

    5.名词解释 

    BEFORE : 代表的意识是在我们的操作(insert,update,delete) 之前就执行触发器

    AFTER : 代表的意识是在我们的操作(insert,update,delete)    之后才执行触发器

    NEW: 对于insert来说,是将要或者已经新增的数据条

                 对于update来说,是将要或者已经修改的数据条

                 delete则没有NEW

    OLD:     对于delete来说,是将要或者已经删除的数据条

                 对于update来说,是修改前的数据条

                 insert则没有OLD

    NEW和OLD需要大家想一想就知道是啥意思了。

     

  • 相关阅读:
    JNoteHelper 给你的java swing或桌面程序提供一双翅膀
    GO中的文件操作
    Vue 3.3.6 发布,得益于WeakMap,它更快了
    【音视频开发之起始】
    Flutter 处理异步操作并根据异步操作状态动态构建界面的方法FutureBuilder
    LeetCode第二题: 两数相加
    PHP框架详解 - Symfony框架
    【C++】C 语言 和 C++ 语言中 const 关键字分析 ( const 关键字左数右指原则 | C 语言中常量的原理和缺陷 | C++ 语言中常量原理 - 符号表存储常量 )
    ESP32开发日志记录
    Python 进阶 - 日常工作中使用过的简单Trick
  • 原文地址:https://blog.csdn.net/qq_42807952/article/details/134443784