试图触发一个拒绝工作的触发器,我认为必须将它设置为一个工作程序,这是我从未使用过的程序,有人能告诉我我将如何处理吗?触发器在添加时不显示错误,但什么也不做
**现在,除了将已处理的值更改为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/