【问题标题】:MySQL - After Update Trigger on Specific Column affects all rows in the tableMySQL - 在特定列上的更新触发器影响表中的所有行
【发布时间】:2014-12-26 17:57:45
【问题描述】:

在我的数据库 (MySQL) 中,我有以下触发器 -

CREATE TRIGGER inventory_qty_trigger 
AFTER UPDATE OF inventory_sku_quantity ON inventory_sku 
BEGIN 
  UPDATE inventory_sku 
  SET inventory_sku_quantity = 0 
  WHERE NEW.inventory_sku_quantity < 0; 
END;

目标是使inventory_sku_quantity 小于零时为零。但是我们观察到的是,当我们更新一个 sku 数量小于零的商品时,所有的 sku 数量都变为零了。

似乎 where 条件不正确 - WHERE NEW.inventory_sku_quantity &lt; 0; 而应该是

CREATE TRIGGER inventory_qty_trigger 
AFTER UPDATE OF inventory_sku_quantity 
ON inventory_sku 
BEGIN 
    UPDATE inventory_sku 
    SET inventory_sku_quantity = 0 
    WHERE inventory_id = NEW.inventory_id 
    AND NEW.inventory_sku_quantity < 0; 
END;

总结两个问题:

  1. 是否允许使用AFTER UPDATE 触发器来重置受影响的列值。
  2. 我们有问题的触发器使所有行inventory_sku_quantity 变为零。

相反,我只希望受影响的行为零,这意味着在 WHERE 子句中添加一个额外的条件。

【问题讨论】:

    标签: mysql sql triggers sql-update


    【解决方案1】:

    NEW.inventory_sku_quantity新插入的行的值。因此,您的代码基本上对新插入的行符合某些条件的每一行执行更新,这将是所有这些条件,因为行的内容不会影响条件。

    您只需在before update 触发器中设置新行的值,而不是更新:

    CREATE TRIGGER inventory_qty_trigger 
    BEFORE UPDATE OF inventory_sku_quantity 
    ON inventory_sku 
    BEGIN 
        IF NEW.inventory_sku_quantity < 0 THEN
           SET NEW.inventory_sku_quantity = 0
        END IF;
    END;
    

    【讨论】:

      【解决方案2】:

      您可以使用 if 条件来实现这一点。

      BEGIN 
        if NEW.inventory_sku_quantity < 0 then 
          UPDATE inventory_sku 
          SET inventory_sku_quantity = 0 
          WHERE inventory_id = NEW.inventory_id ; 
        end;
      END;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-20
        • 2023-02-25
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        相关资源
        最近更新 更多