MySQL 触发器:联动更新订单表 (item 插入触发 orders)

本示例演示了如何使用 MySQL 触发器,在 item 表中插入数据时,自动更新 orders 表中的相关信息。具体逻辑为:

  1. 检查 orders 表中是否已有该订单信息。
  2. 如果 orders 表中没有该订单信息,则添加一条新的订单信息。
  3. 如果 orders 表中已有该订单信息,则更新订单的数量和总价。

代码实现:

CREATE TRIGGER tr_itemInsert
BEFORE INSERT ON item
FOR EACH ROW
BEGIN
    DECLARE order_id INT;
    DECLARE total_price DECIMAL(10,2);
    DECLARE item_price DECIMAL(10,2);
    DECLARE item_quantity INT;
    
    -- 检查orders表中是否已有该订单信息
    SELECT id, total_price INTO order_id, total_price FROM orders WHERE id = NEW.order_id;
    
    -- 如果orders表中没有该订单信息,则添加一条新的订单信息
    IF order_id IS NULL THEN
        INSERT INTO orders (id, total_price, created_at, updated_at)
        VALUES (NEW.order_id, NEW.price * NEW.quantity, NOW(), NOW());
    -- 如果orders表中已有该订单信息,则更新订单的数量和总价
    ELSE
        SELECT price, quantity INTO item_price, item_quantity FROM item WHERE id = NEW.id;
        UPDATE orders SET total_price = total_price + (NEW.price * NEW.quantity) - (item_price * item_quantity), updated_at = NOW() WHERE id = NEW.order_id;
    END IF;
END;

解释:

  • CREATE TRIGGER tr_itemInsert:创建一个名为 tr_itemInsert 的触发器。
  • BEFORE INSERT ON item:在 item 表中插入数据之前触发。
  • FOR EACH ROW:对每个插入的记录都执行触发器。
  • DECLARE:声明变量。
  • SELECT ... INTO ...:将查询结果存储到变量中。
  • IF ... THEN ... ELSE ... END IF:条件语句,根据 orders 表中是否存在该订单来执行不同的操作。
  • INSERT INTO ... VALUES ...:添加新的订单信息到 orders 表。
  • UPDATE ... SET ... WHERE ...:更新 orders 表中的订单数量和总价。

注意:

  • 触发器代码中使用了 NOW() 函数获取当前时间,用于更新 created_atupdated_at 字段。
  • 触发器中的代码需要根据实际数据库表结构进行调整。

通过使用触发器,可以实现数据库表之间的数据联动,提高数据一致性和完整性。

MySQL 触发器:联动更新订单表 (item 插入触发 orders)

原文地址: https://www.cveoy.top/t/topic/oBa4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录