MySql存储过程如何处理?

时间:2016-01-11 18:00:09

标签: mysql triggers procedure

尝试触发工作,拒绝我认为必须将其设置为工作的程序,我之前从未使用过,任何人都可以告诉我如何解决这个问题?添加时触发器不会显示错误,但只是没有做任何事情

**除了将处理更改为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

2 个答案:

答案 0 :(得分:0)

什么是ebaylinked?定义触发器时应该收到错误。

如果要更新触发器定义的表,则应使用BEFORE UPDATE触发器。所以,我想你打算:

DELIMITER $$

CREATE TRIGGER `Update` BEFORE UPDATE ON `ebaylinked`
 FOR EACH ROW
BEGIN
    UPDATE product p
        SET p.product_stock = p.product_stock - new.QuantitySold
        WHERE p.eBay_ID = new.ebay_ID AND new.Processed = 1;

    SET new.Processed = 0;
END; $$

DELIMTER ;

答案 1 :(得分:0)

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

现在针对实际问题,您对触发器代码中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列,因为它没有任何用处(如果触发插入包含在事务中),但是如果绝对必须使用它,您可以将触发器更改为,如下所示:

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:你可以通过调用存储过程的触发器执行此操作,但对于这个简单的事情,我认为它会增加比它值得的复杂性。