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
  • 交易请求

错误:

错误 1442:无法更新存储函数/触发器中的表“trade_request”,因为它已被调用此存储函数/触发器的语句使用。

这没用!问题是什么?

4

3 回答 3

5
  1. 用于is null检查空值。
  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

三个问题:

  1. 要测试 null,请使用is null(not = nullwhich is never true)
  2. 要在传入行中设置新值,请使用NEW.column = some_value
  3. 您不能在一个触发器中两次更新表

试试这个:

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 回答