MySQL - 更新后特定列上的触发器会影响表中的所有行

时间:2014-12-26 17:57:45

标签: mysql sql triggers sql-update

在我的数据库(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小于零时使WHERE NEW.inventory_sku_quantity < 0;为零。但我们观察到的是,当我们更新sku数量小于零的项目时,所有sku数量都变为零。

看来where条件不正确 - 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; 而应该是

AFTER UPDATE

总结两个问题:

  1. 是否允许使用inventory_sku_quantity触发器重置受影响的列值。
  2. 我们遇到触发器的问题使所有行WHERE变为零。
  3. 相反,我只希望受影响的行为零,这意味着在{{1}}子句中添加额外条件。

2 个答案:

答案 0 :(得分:2)

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;

答案 1 :(得分:1)

您可以使用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;