2

必要なテーブルがあります。テーブルが更新されると、その 2 つのフィールド (タイトルと説明) が変更され、別のテーブルから値が取得されます。

これは私のトリガーです:

drop trigger trigger_trade_request ;
CREATE TRIGGER trigger_trade_request AFTER UPDATE ON `trade_request` 
FOR EACH ROW 
BEGIN 

  IF NEW.title = null THEN

    UPDATE `trade_request_type`,`trade_request` 
       SET NEW.title = `trade_request_type`.title ,
           NEW.description = `trade_request_type`.description
     WHERE `trade_request_type`.id = NEW.trade_request_typeId;

  END IF;   
END;

私のテーブル:

  • trade_request_type
  • trade_request

エラー:

エラー 1442 : このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'trade_request' を更新できません。

それは動作しません!問題は何ですか?

4

3 に答える 3

5
  1. is nullnull 値をチェックするために使用します。
  2. 更新された行の値を変更するには、BEFOREトリガーと行を使用SETNEWます。

これを試して:

CREATE TRIGGER trigger_update_request BEFORE UPDATE ON `trade_request`
FOR EACH ROW
BEGIN
    IF NEW.title IS NULL THEN
        SET NEW.title = (SELECT title FROM trade_request_type
            WHERE trade_request_type.id = NEW.trade_request_typeId);
        SET NEW.description = (SELECT description FROM trade_request_type
            WHERE trade_request_type.id = NEW.trade_request_typeId);
    END IF;
END;

おそらく、次のようSELECT...INTOに の代わりに構文を使用できます。SET

CREATE TRIGGER trigger_update_request BEFORE UPDATE ON `trade_request`
FOR EACH ROW
BEGIN
    IF NEW.title IS NULL THEN
        SELECT title, description
        FROM trade_request_type
        WHERE trade_request_type.id = NEW.trade_request_typeId
        INTO NEW.tile, NEW.description;
    END IF;
END;
于 2011-06-19T05:51:05.380 に答える
0

これは、他のテーブルも更新しようとしているためです。それを試してください:

UPDATE `trade_request`
   SET NEW.title = `trade_request_type`.title ,
       NEW.description = `trade_request_type`.description
 FROM `trade_request_type`
 WHERE `trade_request_type`.id = NEW.trade_request_typeId;
   AND `trade_request_type`.id = `trade_request`.id
于 2011-06-19T05:38:47.707 に答える
0

3 つの問題:

  1. null をテストするには、is null(not = nullwhich is never true) を使用します。
  2. 入力行に新しい値を設定するには、次を使用しますNEW.column = some_value
  3. 1 つのトリガーでテーブルを 2 回更新することはできません

これを試して:

drop trigger trigger_trade_request ;
CREATE TRIGGER trigger_trade_request BEFORE UPDATE ON `trade_request` 
FOR EACH ROW 
BEGIN 
  IF NEW.title is null THEN
       SET NEW.title = (select title from trade_request_type WHERE trade_request_type.id = NEW.trade_request_typeId);
       SET NEW.description = (select description from trade_request_type WHERE trade_request_type.id = NEW.trade_request_typeId);
  END IF;   
END;
于 2011-06-19T05:39:17.260 に答える