我正在为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.
1条答案
按热度按时间6ljaweal1#
这是触发器中的mysql限制。在触发器中,不允许对导致触发触发器的语句中引用的任何表发出dml语句(insert/update/delete)。
看起来我们要将插入行中的一列设置为一个值。
通常情况下,最好在
BEFORE INSERT
触发。一BEFORE INSERT
允许触发器执行SELECT
在其他table上。后续行动
现在还不清楚我们打算用这个触发器做什么。但我们知道它不能发布
UPDATE
在pago
.下面是一个
BEFORE INSERT
尝试设置b_idboleta
查询结果的列。如果select查询不返回行,我们将添加一个continue处理程序来捕获错误。