ERROR 1442: Can't update table in stored function/trigger because it is already used by statement which invoked this stored function/trigger

China☆狼群 提交于 2019-12-23 22:27:59

问题


I have a table that I want : when the table has been updated, 2 fields of that (title and description) change and take value from another table

This is my trigger:

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;

My tables:

  • trade_request_type
  • trade_request

error:

ERROR 1442 : Can't update table 'trade_request' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

It does not work! What is the prob?


回答1:


  1. Use is null to check for null values.
  2. To change the value of the updated row use BEFORE trigger and SET on the NEW row.

Try this:

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;

Probably you can use the SELECT...INTO syntax instead of SET, like so:

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;



回答2:


This is because you are trying to update the other table too. Try that:

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



回答3:


Three problems:

  1. To test for null, use is null (not = null which is never true)
  2. To set new values in your incoming row, use NEW.column = some_value
  3. You can't update multiple table at once

Try this:

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;


来源:https://stackoverflow.com/questions/6400618/error-1442-cant-update-table-in-stored-function-trigger-because-it-is-already

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!