2012-07-25 217 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`));