MySql Stored Procedure如何处理?
MySql Stored Procedure how to approach?
试图让一个触发器工作但拒绝工作我认为它必须设置为一个程序才能工作,我以前从未使用过任何人都可以告诉我我将如何处理这个问题?触发器在添加时不显示错误,只是不执行任何操作
** 除了将 processed 更改为 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
?定义触发器时应该会出错。
如果要更新触发器定义的 table,则应使用 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 ;
首先,为您的触发器找到一个更具描述性的名称 ;)。
现在对于实际问题,您在触发器代码中对 ebaylinked
中的列的引用几乎大部分是错误的。要使用您刚刚更新的记录中的值,您需要使用伪记录 NEW
,它是包含 table 的当前行的单个记录它将在更新完成后。 像 ebaylinked.QuantitySold
这样的引用是不明确的,因为它们没有指定 哪一行数据 是正确的一。
此外,您不能引用触发table中的其他行。因此,您的子句 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
列,因为它没有任何用处(前提是触发 insert 包含在事务中),但是如果您 绝对必须使用它,您可以将触发器更改为行之前,如下所示:
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
和后面的任何内容之间的 space。当触发器主体包含多个以分号结尾的语句时,此指令在某些客户端中是必需的。
希望对您有所帮助。
PS:您 可以 使用触发器调用存储过程来执行此操作,但对于如此简单的事情,我认为它会增加更多的复杂性,而不是值得的.
试图让一个触发器工作但拒绝工作我认为它必须设置为一个程序才能工作,我以前从未使用过任何人都可以告诉我我将如何处理这个问题?触发器在添加时不显示错误,只是不执行任何操作
** 除了将 processed 更改为 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
?定义触发器时应该会出错。
如果要更新触发器定义的 table,则应使用 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 ;
首先,为您的触发器找到一个更具描述性的名称 ;)。
现在对于实际问题,您在触发器代码中对 ebaylinked
中的列的引用几乎大部分是错误的。要使用您刚刚更新的记录中的值,您需要使用伪记录 NEW
,它是包含 table 的当前行的单个记录它将在更新完成后。 像 ebaylinked.QuantitySold
这样的引用是不明确的,因为它们没有指定 哪一行数据 是正确的一。
此外,您不能引用触发table中的其他行。因此,您的子句 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
列,因为它没有任何用处(前提是触发 insert 包含在事务中),但是如果您 绝对必须使用它,您可以将触发器更改为行之前,如下所示:
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
和后面的任何内容之间的 space。当触发器主体包含多个以分号结尾的语句时,此指令在某些客户端中是必需的。
希望对您有所帮助。
PS:您 可以 使用触发器调用存储过程来执行此操作,但对于如此简单的事情,我认为它会增加更多的复杂性,而不是值得的.