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

时间:2011-06-19 04:49:46

标签: mysql sql triggers mysql-error-1442

我有一个我想要的表:当表更新时,其中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',因为它已被调用此存储函数/触发器的语句使用。

它不起作用!问题是什么?

3 个答案:

答案 0 :(得分:4)

  1. 使用is null检查空值。
  2. 要更改BEFORE行上更新的行使用SET触发器和NEW的值。
  3. 试试这个:

    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;
    

答案 1 :(得分: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

答案 2 :(得分:0)

三个问题:

  1. 要测试null,请使用is null(不是= null,这是永远不会的)
  2. 要在传入的行中设置新值,请使用NEW.column = some_value
  3. 您无法一次更新多个表格
  4. 试试这个:

    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;