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

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

我正在为mysql编写一个触发器(在workbench 8中),它是在插入表之后触发的,我的触发器如下所示:

  1. DELIMITER //
  2. Drop trigger if exists tr_pago;
  3. CREATE TRIGGER tr_pago after insert on pago for each row
  4. BEGIN
  5. declare ultimoidpago int;
  6. declare idcompromisopago int;
  7. declare idunidadrecaudadora int;
  8. declare idboleta int;
  9. Set ultimoidpago = new.IdPago
  10. Set idcompromisopago = (select new.CP_IdCompromisoPago from pago where IdPago = ultimoidpago);
  11. Set idunidadrecaudadora = (select UR_IdUnidadRecaudadora from compromiso_pago where IdCompromisoPago = idcompromisopago);
  12. Set idboleta = (select IdBoleta from boleta where UR_IdUnidadRecaudadora = idunidadrecaudadora );
  13. update pago set new.B_IdBoleta = idboleta where IdPago = ultimoidpago;
  14. END
  15. DELIMITER //

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

  1. 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上。

  1. SET NEW.B_IdBoleta = expr ;

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

  1. DELIMITER //
  2. CREATE TRIGGER tr_pago
  3. BEFORE INSERT ON pago
  4. FOR EACH ROW
  5. BEGIN
  6. DECLARE CONTINUE HANDLER FOR 1329 BEGIN SET NEW.b_idboleta = NULL; END;
  7. SELECT bo.idboleta
  8. INTO NEW.b_idboleta
  9. FROM compromiso_pago cp
  10. JOIN boleta bo
  11. ON bo.ur_idunidadrecaudadora = cp.ur_idunidadrecaudadora
  12. WHERE cp.idcompromisopago = NEW.cp_idcompromisopago
  13. ORDER
  14. BY bo.idboleta
  15. LIMIT 1;
  16. END//
  17. DELIMITER ;
展开查看全部

相关问题