¿Потому что я не могу обновить таблицу, связанную с триггерами на MySQL? - PullRequest
0 голосов
/ 12 октября 2018

Я программирую триггер (в рабочей среде 8) для mysql, который запускается после вставки в таблицу, мой триггер выглядит следующим образом:

 DELIMITER //
Drop trigger if exists tr_pago;
CREATE TRIGGER tr_pago after insert on pago for each row 
BEGIN
    declare ultimoidpago int;
    declare idcompromisopago int;
    declare idunidadrecaudadora int;
    declare idboleta int;

    Set ultimoidpago = new.IdPago
    Set idcompromisopago  = (select new.CP_IdCompromisoPago from pago where IdPago = ultimoidpago);
    Set idunidadrecaudadora = (select UR_IdUnidadRecaudadora from compromiso_pago where IdCompromisoPago = idcompromisopago);
    Set idboleta = (select IdBoleta from boleta where UR_IdUnidadRecaudadora = idunidadrecaudadora );
    update pago set new.B_IdBoleta = idboleta where IdPago = ultimoidpago;
END
DELIMITER //

Но при выполнении вставки в таблицу платежей,Я получаю следующую ошибку:

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

1 Ответ

0 голосов
/ 12 октября 2018

Это ограничение MySQL в триггере.Внутри триггера не разрешено выдавать оператор DML (INSERT / UPDATE / DELETE) для любой таблицы, на которую ссылается оператор, вызвавший срабатывание триггера.

Похоже, мы хотим установитьстолбец во вставленной строке со значением.

Обычно это лучше обрабатывать в триггере BEFORE INSERT.Триггеру BEFORE INSERT разрешено выполнять SELECT для других таблиц.

SET NEW.B_IdBoleta = expr ;

FOLLOWUP

Не ясно, для чего предназначен этот триггерсделать.Но мы знаем, что он не может выдать UPDATE для pago.

Вот пример триггера BEFORE INSERT, который пытается установить значение столбца b_idboleta из результата запроса,Мы добавляем обработчик продолжения, чтобы перехватить ошибку, если запрос SELECT не возвращает строку.

 DELIMITER //

 CREATE TRIGGER tr_pago
 BEFORE INSERT ON pago
 FOR EACH ROW
 BEGIN
    DECLARE CONTINUE HANDLER FOR 1329 BEGIN SET NEW.b_idboleta = NULL; END;
    SELECT bo.idboleta
      INTO NEW.b_idboleta
      FROM compromiso_pago cp
      JOIN boleta bo
        ON bo.ur_idunidadrecaudadora = cp.ur_idunidadrecaudadora
     WHERE cp.idcompromisopago = NEW.cp_idcompromisopago
     ORDER
        BY bo.idboleta
     LIMIT 1;
 END//

 DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...