0

この問題の解決にご協力いただければ幸いです。古いフィールドの長さが 1 より大きいかどうかに基づいて、2 種類の更新クエリを実行しようとしています。この背後にある考え方は、ユーザーが製品を更新すると、純粋に検索に使用される検索テーブルに ProductRef が追加されるというものです。

したがって、単純に、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 構造を次に示します。

データベース構造

4

2 に答える 2

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;

2 つの UPDATE ステートメントを 1 つに:

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 ;
于 2012-07-25T09:44:21.823 に答える
0

以下は、テストされていない update 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` ));
于 2012-07-25T09:44:20.393 に答える