如何检查Variable是否为null,如果为null则将其设置为零

时间:2020-04-04 08:11:22

标签: mysql null database-trigger

我有两个表,分别是表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 ;```

2 个答案:

答案 0 :(得分:0)

如果有充分的理由在更新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;

或者用于逐行保持项目列表同步,例如“我们一次只能在rekod中更新一个项目”

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就像一个历史表一样,只有很长的加减号序列

我个人只是将我想知道余额的所有尖齿加起来,而不是尝试使项目列表保持同步

答案 1 :(得分:0)

测试每一行的状态并确定是否要加还是减就应该足够了

喜欢

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 ;
相关问题