2012-07-25 237 views
0

我真的希望你能幫助我解決這個問題..我試圖根據舊字段長度是否大於1而運行兩種不同的更新查詢。這背後的想法是,當用戶更新產品時,它會將ProductRef附加到純粹用於搜索的搜索表中。MySQL IF語句觸發內UPDATE語句

簡而言之,如果ProductRef的字符串長度大於0,則用舊的產品參考替換舊的產品參考。否則,請添加新產品參考。以下是我有這麼遠,但它似乎觸發錯誤 -

-- Update the ProductType UpdatedTS that corresponds with this product 
-- The below section simply updates the main products UpdatedTS 
UPDATE tbl_product_types 
SET UpdatedTS = now() 
WHERE ID = New.ProductTypeID; 

IF (SELECT Length(Old.ProductRef) > 0) 
    BEGIN 
     -- We have already stored the product reference so run a replace 
     UPDATE tbl_product_type_search AS STable 
     SET `STable.Search` = replace(`Search`,CONCAT(Old.ProductRef,' '),New.ProductRef) 
     WHERE `STable.ProductTypeID` = Old.ProductTypeID 
    END 
ELSE 
    BEGIN 
     -- We haven't yet stored the product reference, store it 
     UPDATE tbl_product_type_search AS STable 
     SET `STable.Search` = CONCAT(NEW.ProductRef,' ',`STable.Search`) 
     WHERE STable.ProductTypeID = New.ProductTypeID 
    END 

供您參考,這裏是有關DB結構:

Database Structure

+0

什麼樣的你有錯誤嗎? – Zagor23 2012-07-25 09:40:27

+0

Old.ProductRef來自哪裏?沒有看到別名Old。 – sel 2012-07-25 09:41:06

+0

我得到一個一般的語法錯誤,說X行和在哪一點的錯誤。舊記錄由記錄定義,因爲它是更新的觸發器。舊的是更新之前舊記錄的內容。 – Chris 2012-07-25 15:21:17

回答

1

看來它是UPDATE觸發器。不是嗎?如果是的話,試試這個代碼(也有一些語法錯誤) -

UPDATE 
    tbl_product_types 
    SET 
    UpdatedTS = NOW() 
    WHERE ID = NEW.ProductTypeID; 

    IF (SELECT length(Old.ProductRef) > 0) THEN 
    -- We have already stored the product reference so run a replace 
    UPDATE 
     tbl_product_type_search AS STable 
    SET 
     `STable.Search` = REPLACE(`Search`, CONCAT(Old.ProductRef, ' '), NEW.ProductRef) 
    WHERE 
     `STable.ProductTypeID` = OLD.ProductTypeID; 
    ELSE 
    -- We haven't yet stored the product reference, store it 
    UPDATE 
     tbl_product_type_search AS STable 
    SET 
     `STable.Search` = CONCAT(NEW.ProductRef, ' ', `STable.Search`) 
    WHERE 
     STable.ProductTypeID = NEW.ProductTypeID; 
    END IF; 

兩個UPDATE語句爲一個:

UPDATE 
    tbl_product_type_search AS STable 
SET 
    `STable.Search` = 
    IF(
     LENGTH(OLD.ProductRef) > 0, 
     REPLACE(`Search`, CONCAT(OLD.ProductRef,' '), NEW.ProductRef), 
     CONCAT(NEW.ProductRef, ' ', `STable.Search`) 
    ) 
WHERE 
    LENGTH(OLD.ProductRef) > 0 AND `STable.ProductTypeID` = OLD.ProductTypeID 
    OR 
    LENGTH(OLD.ProductRef) <= 0 AND STable.ProductTypeID = NEW.ProductTypeID 

關於分隔符:

DELIMITER $$ 

CREATE TRIGGER trigger_name 
AFTER UPDATE 
ON table_name 
FOR EACH ROW 
BEGIN 

    UPDATE tbl_product_types...; 

    other statements...; 
END 
$$ 

DELIMITER ; 
+0

嗨,感謝您的努力,雖然它錯誤地回來了。你說這是一個UPDATE觸發器是正確的,它在記錄保存後觸發。我的錯誤是'你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在'IF(SELECT length(Old.ProductRef)>)附近使用正確的語法,然後在第1行更新tbl_product_type_' – Chris 2012-07-25 10:56:35

+0

我試過這段代碼。它工作正常。嘗試添加DELIMITER。也看看答案,對於兩個UPDATE語句還有一個解決方案。 – Devart 2012-07-25 12:46:08

+0

我正在使用Navicat來管理我的觸發器,所以也許這就是問題所在......我感謝您的幫助,我會盡力讓這個工作成功! – Chris 2012-07-25 15:15:57

0

下面是未經檢驗的更新if語句。你可以試試看。

UPDATE tbl_product_type_search AS STable 
inner join tbl_product_type_search as Old on STable.ID=Old.ID 
SET `STable.Search` = 
    IF(Length(Old.ProductRef) > 0 AND `STable.ProductTypeID` = Old.ProductTypeID, 
     replace(`Search`,CONCAT(Old.ProductRef,' '),New.ProductRef), 
     IF(Length(Old.ProductRef) < 0 AND STable.ProductTypeID = New.ProductTypeID, 
      CONCAT(NEW.ProductRef,' ',`STable.Search`) ,`STable.Search`));