尝试触发工作,拒绝我认为必须将其设置为工作的程序,我之前从未使用过,任何人都可以告诉我如何解决这个问题?添加时触发器不会显示错误,但只是没有做任何事情
**除了将处理更改为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
答案 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:你可以通过调用存储过程的触发器执行此操作,但对于这个简单的事情,我认为它会增加比它值得的复杂性。