mysql - SQL - 插入后创建触发器
问题描述
我有这四个存储菜单和成分的表,如果在 from 中添加一行,则customer_order
应该根据from时间 order_quantity from自动扣除。raw_material_quantity
raw_materials
quantity
menu_inventory
customer_order
表格菜单
+-----------+-----------+
| menu_code | menu_name |
+-----------+-----------+
| prod-001 | Ice cream |
+-----------+-----------+
表原材料
+-------------------+-------------------+-----------------------+
| raw_material_code | raw_material_name | raw_material_quantity |
+-------------------+-------------------+-----------------------+
| item-001 | sugar | 10 |
+-------------------+-------------------+-----------------------+
| item-002 | cream | 20 |
+-------------------+-------------------+-----------------------+
表menu_inventory
+-----------------------+-------------------+-----------+----------+
| raw_ingredients_number| raw_material_code | menu_code | quantity |
+-----------------------+-------------------+-----------+----------+
| 1 | item-001 | prod-001 | 5 |
+-----------------------+-------------------+-----------+----------+
| 2 | item-002 | prod-001 | 10 |
+-----------------------+-------------------+-----------+----------+
表 customer_order
+-------------------+--------------+-----------+----------------+
| customer_order_no | customer_no | menu_name | order_quantity |
+-------------------+--------------+-----------+----------------+
| 1 | customer-001 | Ice Cream | 2 |
+-------------------+------------- +-----------+----------------+
所以我想customer_order
在插入后为表创建一个触发器。我已经创建了一个,但它没有提供准确的结果。任何答案都会有很大帮助,谢谢。
编辑
CREATE DEFINER=`root`@`localhost` TRIGGER `customer_order_AFTER_INSERT` AFTER INSERT ON `customer_order` FOR EACH ROW BEGIN
declare x int;
declare y int;
declare quantity_1 int;
declare quantity_2 int;
declare sums int;
if (select count(raw_material_code) from menu_inventory where menu_code = new.menu_code > 0)
then
set y = new.order_quantity;
DROP TEMPORARY TABLE IF EXISTS `temptable`;
CREATE TEMPORARY TABLE temptable (select row_number() over() as raw_ingredients_number,quantity,raw_material_code from menu_inventory where menu_code = new.menu_code);
while y > 0 do
set x = (select count(raw_material_code ) from menu_inventory where menu_code = new.menu_code);
while x > 0 do
set @mcode = (select menu_code from temptable where menu_ingredients_number = x);
set @rcode = (select raw_material_code from raw_material where raw_material_name = @mcode);
set quantity_1 = (select raw_material_quantity from raw_material where raw_material_name = @mcode);
set quantity_2 = (select quantity from temptable where menu_ingredients_number = x);
set sums = quantity_1-quantity_2;
update raw_material set raw_material_quantity = sums where raw_material_code = @rcode;
set x=x-1;
end while;
set y=y-1;
end while;
end if;
END
解决方案
更简洁的方法是在触发器中使用多表更新
drop trigger if exists `customer_order`;
delimiter $$
CREATE TRIGGER `customer_order_AFTER_INSERT` AFTER INSERT ON `customer_order`
FOR EACH ROW
BEGIN
update raw_materials r
join menu m on m.menu_name = new.menu_name
join menu_inventory mi on mi.menu_code = m.menu_code
set r.raw_material_quantity = r.raw_material_quantity - (new.Order_quantity * mi.quantity)
where r.raw_material_code = mi.raw_material_code;
end $$
delimiter ;
推荐阅读
- php - 数组 PHP 中的类似查找
- css - 悬停时将图像从灰色变为真正的深黑色
- objective-c - deferredCurrentActivation 致命异常
- dart - Dart & Flutter:如何等待请求结果
- c++ - 指针与继承的关系 c++ oop
- node.js - npm 总是在 ubuntu 中创建一个带有节点模块的 min 文件夹
- algorithm - 求解非线性丢番图方程,例如 (8+3n)m = 11?
- javascript - 在反应渲染中将数组转换为字符串失败-Javascript/React
- java - 什么是 CompoundCallable?
- react-native - 从抽屉导航器导航到特定选项卡