我有两个表,分别是表Item List
和表Rekod
。我尝试创建一个触发器,该触发器将在更新记录的任何地方更新表item_list
中特定项目的数量。但是,输入第一条记录时我遇到了问题。触发器将不起作用。仅当加和减记录已经存在时,它才起作用。我尝试了此操作,但似乎我也无法再更新rekod
表
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
DECLARE add INT;
DECLARE minus INT;
DECLARE final INT;
SET add =
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "add" &&rekod.SKU=item_list.SKU )
FROM item_list ;
SET minus =
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "minus" &&rekod.SKU=item_list.SKU )
FROM item_list ;
IF add IS NULL
THEN
SET add = 0;
END IF;
IF minus IS NULL
THEN
SET minus = 0;
END IF;
SET final = add - minus;
UPDATE item_list SET Quantity = final;
END;
//
delimiter ;```
如果有很好的理由为什么在更新rekod时应该同步所有时间清单,例如“当我们更新rekod时我们一次更改10000行”
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
BEGIN
UPDATE
item_list
INNER JOIN (SELECT sku, SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod) x
ON x.sku = item_list.sku
SET item_list.quantity = x.s;
END;
//
delimiter;
或者用于逐行保持项目列表同步,例如“我们一次只能更新一个项目”
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
UPDATE
item_list
SET quantity = (SELECT SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod WHERE sku = new.sku)
WHERE sku = new.sku;
END;
//
delimiter;
不确定您对插入的处理方式-我以为rekod就像一个历史表一样,只有很长的加和减序列
我个人只是想将每一个我想知道余额的尖齿加起来,而不是尝试使项目列表保持同步
应该足以测试每一行的状态并确定是否要加或减
赞
DELIMITER //
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
IF NEW.status = "add" THEN
SET @add = NEW.quantity;
ELSE
SET @add = - NEW.quantity;
END IF;
UPDATE item_list SET Quantity = Quantity + @add WHERE sku = new.sku;
END;
//
delimiter ;