MySQL 触发器:联动更新订单表 (item 插入触发 orders)
MySQL 触发器:联动更新订单表 (item 插入触发 orders)
本示例演示了如何使用 MySQL 触发器,在 item 表中插入数据时,自动更新 orders 表中的相关信息。具体逻辑为:
- 检查
orders表中是否已有该订单信息。 - 如果
orders表中没有该订单信息,则添加一条新的订单信息。 - 如果
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_at和updated_at字段。 - 触发器中的代码需要根据实际数据库表结构进行调整。
通过使用触发器,可以实现数据库表之间的数据联动,提高数据一致性和完整性。
原文地址: https://www.cveoy.top/t/topic/oBa4 著作权归作者所有。请勿转载和采集!