¿因为我无法更新与MySQL上的触发器相关联的表?

时间:2018-10-12 18:43:42

标签: mysql triggers mysql-workbench

我正在为MySQL编写一个触发器(在工作台8中),该触发器是在插入表后触发的,我的触发器如下:

 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 :(得分:0)

这是触发器中的MySQL限制。在触发器内,不允许对导致触发器被触发的语句中引用的任何表发出DML语句(INSERT / UPDATE / DELETE)。

好像我们想将插入行中的一列设置为一个值。

通常可以在BEFORE INSERT触发器中更好地处理此问题。允许BEFORE INSERT触发器对其他表执行SELECT

SET NEW.B_IdBoleta = expr ;

关注

目前尚不清楚我们打算如何触发此触发器。但是我们知道它无法在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 ;