在MySQL触发器中声明一个变量;引用相同的行类型

时间:2018-11-10 14:12:29

标签: mysql triggers declare

表数据和更多信息here

products_stock通过products列与mpn具有外键关系。

基本概要:如果mpn表的0列中的available至少比products_stock大一行,则in_stock列应在products表中被触发为1以指示库存。

如果在mpn列中将所有size的行(/ 0变体)设置为available,则触发器应设置in_stock products上的“ 0”表示没有库存。

前者在指示库存时工作得很好,而在0可用时后者根本不工作。我将其归结为无法通过IF rowCount < 1 THEN声明。这是现在的触发器:

BEGIN 

    DECLARE rowCount INTEGER;

    IF NEW.available <> OLD.available THEN 
    IF NEW.available > 0 AND OLD.available <= 0 THEN 
    UPDATE 
      products 
    SET 
      products.in_stock = 1 
    WHERE 
      products.mpn = NEW.mpn;
    ELSEIF NEW.available <= 0 AND OLD.available > 0 THEN 
    SET 
      @rowCount := (
        SELECT 
          COUNT(NEW.mpn) 
        FROM 
          product_stock 
        WHERE 
          product_stock.available > 0
      );
    IF rowCount < 1 THEN 
    UPDATE 
      products 
    SET 
      products.in_stock = 0 
    WHERE 
      products.mpn = NEW.mpn;
    END IF;
    END IF;
    END IF;
    END

我尝试了许多不同的设置@rowCount的变体-直接位于DECLARE rowCount INTEGER;下,嵌入IF条件中(如上所示),并在声明中添加了另一个AND条件( product_stock.available > 0 AND product_stock.mpn = NEW.mpn);)等等。

问题是rowCount在进行计数时没有考虑该行的MPN,而是使用product_stock.available > 0对所有行进行计数,而与MPN无关。

如果我取出@rowCount,它将在products.in_stock中触发0,但并未考虑mpn的其他变体。

是否可以修改触发器/声明的变量以仅计算mpn列在available上的UPDATED

0 个答案:

没有答案