簡體   English   中英

MySql存儲過程如何處理?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM