MySQL通过存储过程向sales表插入数据并校验库存
创建带库存校验的销售数据插入存储过程
以下是针对需求编写的MySQL存储过程,包含完整的参数校验和库存判断逻辑:
DELIMITER // CREATE PROCEDURE InsertSales(IN p_id INT, IN p_qty INT) BEGIN DECLARE available_stock INT; -- 查询目标产品的当前库存 SELECT product_quantity INTO available_stock FROM products WHERE id = p_id; -- 参数与库存校验逻辑 IF p_qty < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '错误:购买数量不能为负数'; ELSEIF available_stock IS NULL THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '错误:指定的产品不存在'; ELSEIF p_qty > available_stock THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '错误:库存不足,无法完成销售'; ELSE -- 插入销售记录 INSERT INTO sales(p_id, p_qty) VALUES(p_id, p_qty); -- 可选:如果需要同步扣减库存,取消下面注释 -- UPDATE products SET product_quantity = product_quantity - p_qty WHERE id = p_id; SIGNAL SQLSTATE '00000' SET MESSAGE_TEXT = '销售记录插入成功'; END IF; END // DELIMITER ;
逻辑说明
- 分隔符修改:使用
DELIMITER //临时修改SQL语句分隔符,避免存储过程内部的分号触发语句执行 - 库存查询:通过
SELECT ... INTO语句获取指定产品的当前库存,存入变量available_stock - 多条件校验:
- 先判断购买数量是否为负数,非法直接抛出错误
- 检查产品是否存在(若
available_stock为NULL,说明无匹配产品) - 最后校验购买数量是否超过可用库存
- 执行插入:所有校验通过后,向
sales表插入销售数据;如果业务需要同步减少库存,可以开启注释里的UPDATE语句
调用示例
-- 插入产品ID为1、数量为3的销售记录 CALL InsertSales(1, 3);
如果使用的是SQL Server等其他数据库,语法会有差异,比如替换SIGNAL为RAISERROR或THROW,调整存储过程的声明格式即可。
内容的提问来源于stack exchange,提问作者Kinza khan
相关产品推荐
相关产品推荐

