试图触发一个拒绝工作的触发器,我认为必须将它设置为一个工作程序,这是我从未使用过的程序,有人能告诉我我将如何处理吗?触发器在添加时不显示错误,但什么也不做

**现在,除了将已处理的值更改为0之外,它确实起作用。

UPDATE product
INNER JOIN ebaylinked ON ebaylinked.ebay_ID = product.eBay_ID
SET product.product_stock = product.product_stock - NEW.QuantitySold,NEW.Processed=0
WHERE product.eBay_ID = NEW.ebay_ID and NEW.Processed = 1

最佳答案

首先,为触发器找到一个更具描述性的名称;)。

现在针对实际问题,您在触发代码中对ebaylinked中的列的引用几乎都是错误的。要使用刚更新的记录中的值,您需要使用伪记录NEW,它是包含表当前行的单个记录,更新完成后将保留该行。像ebaylinked.QuantitySold这样的引用是模棱两可的,因为它们没有指定哪一行数据是正确的。

同样,您不能引用触发表中的其他行。因此,您的子句SET ... ebaylinked.Processed=0 ... WHERE ... ebaylinked.Processed = 1既是多余的也是错误的,因为您的行触发器可以看到的ebaylinked的唯一行是当前行。

因此,您的触发代码应类似于

CREATE TRIGGER `ebaylinked_update_product`
  AFTER UPDATE ON `ebaylinked`
  FOR EACH ROW
    UPDATE product
      SET product.product_stock = product.product_stock - NEW.QuantitySold
      WHERE product.eBay_ID = NEW.ebay_ID;


请注意,我忽略了processed列,因为它没有任何用处(假设触发器插入包含在事务中),但是如果绝对必须使用它,则可以将触发器更改为before行,如下所示:

DELIMITER //

CREATE TRIGGER `ebaylinked_update_product`
  BEFORE UPDATE ON `ebaylinked`
  FOR EACH ROW
  BEGIN
    IF NEW.processed = 1 THEN
      UPDATE product
        SET product.product_stock = product.product_stock - NEW.QuantitySold
        WHERE product.eBay_ID = NEW.ebay_ID;
      SET NEW.processed = 0;
    END IF;
  END;
  //

  DELIMITER ;


注意DELIMITER及其后的所有内容之间的空格。当触发器主体包含以分号终止的多个语句时,在某些客户端中此指令是必需的。

希望能有所帮助。

PS:您可以通过调用存储过程的触发器来执行此操作,但是对于这种简单的操作,我认为它将增加更多的复杂性,而不是值得的。

关于mysql - MySql存储过程如何处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34728088/

10-11 17:23