2016-01-11 113 views
1

試圖得到一個觸發器工作,拒絕我認爲它必須被設置爲一個過程,它以前從未與我合作過的任何人都可以告訴我如何去做這件事?當添加觸發器不顯示錯誤,但只是沒有做任何事情MySql存儲過程如何處理?

**現在不除將加工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

首先,找到一個更具描述性的名稱爲您的觸發器;)。

現在針對實際問題,您在觸發器代碼中對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:你可能用觸發器調用存儲過程來做到這一點,但對於這樣簡單的事情,我認爲它會增加更多的複雜性。

+0

這是相同的增加,但沒有更新任何東西,我檢查了所有的字段是正確的,他們是如此非常困惑與它正在發生什麼 –

+0

就這樣,我們都在同一頁面上,爲我自己描述說出你想讓這個觸發器做什麼。 –

+0

我搞砸了,並在更新上,而不是在插入一切工作與新的一個我除了改變加工領域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 ; 
+0

嘗試使用該代碼時出現此問題#1064 - 您的SQL語法出錯;檢查與您的MariaDB服務器版本相對應的手冊,以獲取在'.Processed = 0; END'在第8行 –

+0

@jamescox。 。 。糟糕,缺少'set'。 –