[英]MySql Stored Procedure how to approach?
試圖觸發一個拒絕工作的觸發器,我認為必須將它設置為一個工作程序,這是我從未使用過的程序,誰能告訴我我將如何處理? 觸發器在添加時不顯示錯誤,但什么也不做
**現在,除了將已處理的值更改為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
? 定義觸發器時,應該會出現錯誤。
如果要更新觸發器定義的表,則應使用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
,它是包含表當前行的單個記錄, 就像更新完成后一樣。 像ebaylinked.QuantitySold
這樣的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:您可以通過調用存儲過程的觸發器來執行此操作,但是對於這種簡單的操作,我認為它會增加比其應有的復雜性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.