¿因为我不能更新mysql上与触发器关联的表?

vom3gejh  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(452)

我正在为mysql编写一个触发器(在workbench 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 //

但是在对payment表进行插入时,出现以下错误:

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

6ljaweal1#

这是触发器中的mysql限制。在触发器中,不允许对导致触发触发器的语句中引用的任何表发出dml语句(insert/update/delete)。
看起来我们要将插入行中的一列设置为一个值。
通常情况下,最好在 BEFORE INSERT 触发。一 BEFORE INSERT 允许触发器执行 SELECT 在其他table上。

SET NEW.B_IdBoleta = expr ;

后续行动
现在还不清楚我们打算用这个触发器做什么。但我们知道它不能发布 UPDATEpago .
下面是一个 BEFORE INSERT 尝试设置 b_idboleta 查询结果的列。如果select查询不返回行,我们将添加一个continue处理程序来捕获错误。

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 ;

相关问题