首页 > 解决方案 > 在 MySQL 触发器中声明一个变量;引用相同的行类型

问题描述

表数据和更多信息在这里

products_stockproducts与viampn列有外键关系。

Basic Rundown:如果anmpn至少比我的表0中的列大一行,则该列应触发为表中的1以指示库存。availableproducts_stockin_stockproducts

如果列中的所有mpn行(/size变体)都设置为0available则触发器应in_stockproducts表上设置为 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 - 而是计算所有行,无论 MPN 是多少,都使用product_stock.available > 0.

如果我取出@rowCount,它会触发 0 in products.in_stock,但不会考虑 mpn 具有的任何其他变体。

是否可以修改触发器/声明的变量以仅计算mpnavailable列所在的值UPDATED

标签: mysqltriggersdeclare

解决方案


推荐阅读