我正在为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.
答案 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 ;