首页 > 数据库 >MySQL 触发器通过示例进行解释:自动化数据库操作

MySQL 触发器通过示例进行解释:自动化数据库操作

时间:2024-12-24 08:58:14浏览次数:5  
标签:INSERT 触发器 示例 order date MySQL id orders

  1. 什么是 MySQL 触发器?
    • 触发器是与表相关的数据库对象,当对表执行特定的操作(如 INSERT、UPDATE、DELETE)时,触发器会自动执行。它就像是一个在后台默默工作的 “小机器人”,一旦监听到指定的事件发生,就会按照预先定义的规则进行操作。
  2. 创建一个简单的 INSERT 触发器示例
    • 假设我们有两个表:orders(订单表)和order_logs(订单日志表)。每当在orders表中插入一条新订单记录时,我们希望在order_logs表中自动插入一条日志记录,记录订单的插入时间。
    • 首先,创建orders表:
      CREATE TABLE orders (
        order_id INT AUTO_INCREMENT PRIMARY KEY,
        customer_name VARCHAR(255),
        order_date DATE
      );
      
    • 然后,创建order_logs表:
      CREATE TABLE order_logs (
        log_id INT AUTO_INCREMENT PRIMARY KEY,
        order_id INT,
        action VARCHAR(10),
        log_date TIMESTAMP
      );
      
    • 现在,创建 INSERT 触发器:
      DELIMITER //
      CREATE TRIGGER after_order_insert
      AFTER INSERT ON orders
      FOR EACH ROW
      BEGIN
        INSERT INTO order_logs (order_id, action, log_date)
        VALUES (NEW.order_id, 'INSERT', NOW());
      END //
      DELIMITER ;
      
    • 解释:
      • DELIMITER //:这是因为在 MySQL 中,触发器的主体部分(BEGINEND之间)包含多条 SQL 语句,默认情况下,;是 SQL 语句的结束符。所以我们先将结束符修改为//,这样在定义触发器时,MySQL 就知道整个BEGIN - END块是一个整体。
      • CREATE TRIGGER after_order_insert:创建一个名为after_order_insert的触发器。
      • AFTER INSERT ON orders:指定这个触发器在orders表执行 INSERT 操作之后触发。
      • FOR EACH ROW:表示对于orders表中插入的每一行数据,都会执行触发器中的操作。
      • BEGIN - END块中:
        • INSERT INTO order_logs (order_id, action, log_date):向order_logs表插入一条记录。
        • VALUES (NEW.order_id, 'INSERT', NOW()):这里的NEW是一个特殊的关键字,当在orders表插入新行时,NEW代表新插入的行。NEW.order_id就是新插入订单的order_idaction设置为INSERT表示插入操作,log_date使用NOW()函数获取当前时间。
    • 测试触发器:
      INSERT INTO orders (customer_name, order_date)
      VALUES ('John Doe', '2024-01-01');
      
       
      • 当执行这条插入订单的 SQL 语句后,MySQL 会自动在order_logs表中插入一条对应的日志记录,记录了订单的插入操作和时间。
  3. UPDATE 触发器示例
    • 假设我们希望在更新orders表中的order_date字段时,在order_logs表中记录更新操作。
    • 创建 UPDATE 触发器:
      DELIMITER //
      CREATE TRIGGER after_order_update
      AFTER UPDATE ON orders
      FOR EACH ROW
      BEGIN
        IF NEW.order_date <> OLD.order_date THEN
          INSERT INTO order_logs (order_id, action, log_date)
          VALUES (NEW.order_id, 'UPDATE', NOW());
        END IF;
      END //
      DELIMITER ;
      
    • 解释:
      • AFTER UPDATE ON orders:这个触发器在orders表执行 UPDATE 操作之后触发。
      • BEGIN - END块中:
        • IF NEW.order_date <> OLD.order_date THENOLD是另一个特殊关键字,代表更新操作之前的行。这里判断如果更新后的order_date和更新前的order_date不同,就执行下面的插入操作。
        • 插入操作与前面 INSERT 触发器中的类似,只是action设置为UPDATE
  4. DELETE 触发器示例
    • 假设我们希望在删除orders表中的记录时,在order_logs表中记录删除操作。
    • 创建 DELETE 触发器:
      DELIMITER //
      CREATE TRIGGER after_order_delete
      AFTER DELETE ON orders
      FOR EACH ROW
      BEGIN
        INSERT INTO order_logs (order_id, action, log_date)
        VALUES (OLD.order_id, 'DELETE', NOW());
      END //
      DELIMITER ;
      
    • 解释:
      • AFTER DELETE ON orders:这个触发器在orders表执行 DELETE 操作之后触发。
      • 在插入操作中,使用OLD.order_id来获取被删除订单的order_idaction设置为DELETE

标签:INSERT,触发器,示例,order,date,MySQL,id,orders
From: https://blog.csdn.net/2403_87015045/article/details/144661203

相关文章

  • MySQL字符集和优化
    MySQL字符集和优化MySQL字符集字符集介绍字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Characterset)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、G......
  • MySQL主从架构
    MySQL主从架构MySQL主从架构(Master-SlaveArchitecture)是一种常见的数据库高可用性和负载均衡的设计模式,通常用于提高系统的可伸缩性和可靠性。它基于数据复制(replication)机制,其中“主”服务器负责处理所有的写操作,而“从”服务器则通过复制主服务器的数据来保持数据一致性,主要用......
  • mysql explain 结果的extra字段解析
    usingindex:sql语句没有where查询条件,使用覆盖索引,不需要回表查询即可拿到结果usingwhere:没有使用索引/使用了索引但需要回表查询且没有使用到下推索引usingindex&&useingwhere:sql语句有where查询条件,且使用覆盖索引,不需要回表查询即可拿到结果。Usingindexcon......
  • Djagno 执行mysql
    https://blog.csdn.net/wglink/article/details/127998343一、增#增definsert_data(name,category,price,quantity):withconnection.cursor()ascursor:sql="insertintogoods(name,category,price,quantity)values(%s,%s,%s,%s)"......
  • Python企业公寓后勤管理系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍论文主要是对后勤管理系统进行了介绍,包括研究的现状,还有涉及的开发背景,然后还对系统......
  • 详解MySQL中 MVCC
    目录第1章:MVCC简介1.1什么是多版本并发控制(MVCC)?1.2MVCC在数据库管理系统中的作用1.3MVCC与传统锁机制的区别1.4为什么需要MVCC?第2章:MVCC的工作原理2.1数据库事务2.2版本控制:如何通过版本号、时间戳来区分不同版本的数据2.3事务的开始与结束(commit和......
  • mysql的事务控制和数据库的备份和恢复
    事务控制语句行锁和死锁行锁两个客户端同时对同一索引行进行操作客户端1正常运行客户端2想修改,被锁行除非将事务提交才能继续运行死锁客户端1删除第5行客户端2设置第1行为排他锁客户端1删除行1被锁客户端2更新行5被锁如何避免死锁mysql的备份和还原......
  • Go语言,查询MySQL数据库
    在Go语言中,查询MySQL数据库的一个常用库是database/sql标准库首先,确保你已经安装了MySQL驱动:goget-ugithub.com/go-sql-driver/mysql示例代码main.gopackagemainimport("database/sql""fmt""log"_"github.com/go-sql-driver/mysql&qu......
  • Mysql面试题一
    MySQL数据库可重复读隔离级别是怎么实现的,MVCC并发版本控制原理MySQL可重复读是通过MVCC实现的MVCC(MultiVersionConcurrencyControl的简称),代表多版本并发控制。与MVCC相对的,是基于锁的并发控制,Lock-BasedConcurrencyControl)。MVCC最大的优势:读不加锁,读写不冲突。......
  • Mysql面试题二
    对MySQL的锁了解吗当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。隔离级别与锁的关系在ReadUncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突在ReadCommitted级别下,读......