ОШИБКА 1442: Невозможно обновить таблицу в сохраненной функции / триггере, потому что она уже используется оператором, который вызвал эту сохраненную функцию / триггер - PullRequest
2 голосов
/ 19 июня 2011

У меня есть таблица, которую я хочу: когда таблица будет обновлена, 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 ]

4 голосов
/ 19 июня 2011
  1. Используйте is null для проверки нулевых значений.
  2. Чтобы изменить значение обновленной строки, используйте триггер BEFORE и SET в строке NEW.

Попробуйте это:

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;
0 голосов
/ 19 июня 2011

Три проблемы:

  1. Чтобы проверить на ноль, используйте is null (не = null, что никогда не соответствует действительности)
  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;
0 голосов
/ 19 июня 2011

Это потому, что вы пытаетесь обновить другую таблицу тоже. Попробуйте это:

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
...