基于指定数据库表创建存储函数productPerOrder与触发器changeCustomer_Category
SQL功能实现方案
基础表结构说明
你提供的4张表关联逻辑如下:
- Customer:存储客户基础信息,customerNO为主键
- Product:存储商品基础信息,productNO为主键
- CustomerOrder:存储订单基础信息,orderNO为主键,customerNO为关联Customer的外键
- OrderedProduct:存储订单关联的商品明细,orderNO、productNO为联合外键,分别关联订单表和商品表
1. 存储函数productPerOrder实现
功能说明:接收订单号作为入参,返回该订单下所有商品的下单总数量,无对应订单时返回0。
以下为MySQL语法实现,其他数据库仅需调整语法关键字即可:
-- 调整分隔符,避免函数内部的分号被提前识别为语句结束 DELIMITER // CREATE FUNCTION productPerOrder(in_orderNO INT) RETURNS INT DETERMINISTIC BEGIN DECLARE total_count INT DEFAULT 0; -- 聚合统计对应订单的商品数量总和 SELECT IFNULL(SUM(orderQuantity), 0) INTO total_count FROM OrderedProduct WHERE orderNO = in_orderNO; RETURN total_count; END // -- 恢复默认分隔符 DELIMITER ;
注:如果你的
orderNO字段类型为字符串,只需把入参in_orderNO的类型调整为对应VARCHAR长度即可。
调用示例:SELECT productPerOrder(1001);即可查询订单号为1001的商品总数量。
2. 触发器changeCustomer_Category实现
功能说明:Customer表的custBalance字段更新前触发,当更新后客户余额低于-10000时,自动调整客户category:B2改B1、C2改C1。
DELIMITER // CREATE TRIGGER changeCustomer_Category BEFORE UPDATE ON Customer FOR EACH ROW BEGIN -- 仅当custBalance字段被修改、且新余额低于阈值时执行逻辑,避免无效触发 IF NEW.custBalance < -10000 AND OLD.custBalance != NEW.custBalance THEN CASE NEW.category WHEN 'B2' THEN SET NEW.category = 'B1'; WHEN 'C2' THEN SET NEW.category = 'C1'; -- 其他category值不做修改 END CASE; END IF; END // DELIMITER ;
内容的提问来源于stack exchange,提问作者hala tech
相关产品推荐
相关产品推荐

