如何制作一个从表中删除数据的触发器,验证我们传递给它的数据是否是旧的。扩展名存在于表中

问题描述 投票:0回答:1

如何使删除表数据的触发器验证我们通过扩展名 old 传递给它的数据。存在于触发器中声明的表中。 我有以下触发器:

DROP TRIGGER IF EXISTS Clase_T_DeleteAlumno;
DELIMITER //
CREATE TRIGGER Clase_T_DeleteAlumno
BEFORE DELETE
ON Alumno FOR EACH ROW
BEGIN
    DECLARE nombreHistorico VARCHAR(50);
    DECLARE existe tinyint;
    DECLARE miError CONDITION FOR SQLSTATE '43001';
    
    SET existe = (select count(*) from alumno where(dni = old.dni));
    
    if(existe = 0) then
        SIGNAL miError SET MESSAGE_TEXT = "ERROR. There is no DNI.";
    else
        DELETE FROM matriculado
        WHERE(dni = old.dni);
        SET nombreHistorico = (select nombre from alumno where(dni = old.dni));
        INSERT INTO alumno_historico VALUES (nombreHistorico, CURDATE());
    end if;
END;
//

这是我的桌子。 校友(dni(PK), nombre, edad) 我创建了一个变量,通过过滤扩展名 old.[attribute] 传递的数据来存储查询结果。该变量包含0或1的值。如果值为0,则表示数据不存在并抛出错误,如果值为1,则表示相反。仅当该值为 1,即数据存在于表中时,删除过程才会继续。

但是,当我尝试通过向其传递不存在的 DNI 来进行删除时,它不会完成验证它是否存在,而是继续处理该事件而不抛出错误。

DELETE FROM alumno
WHERE(dni=4399);

student
表中,我在 DNI 属性中没有任何数据,就像我尝试过的其他数据一样。 任何帮助都会很棒。

triggers mysql-workbench
1个回答
0
投票

仅当记录存在时才会调用删除。因此,如果您尝试删除不存在的 DNI,则不会调用触发器。但是,如果您的目标是保存已删除的记录,则可以使用后触发器:

DROP TRIGGER IF EXISTS Clase_T_DeleteAlumno;
DELIMITER //
CREATE TRIGGER Clase_T_DeleteAlumno
AFTER DELETE

ON Alumno FOR EACH ROW
BEGIN
    DECLARE nombreHistorico VARCHAR(50);

    SET nombreHistorico = old.nombre;
    INSERT INTO alumno_historico VALUES (nombreHistorico, CURDATE());
        
END;
//
© www.soinside.com 2019 - 2024. All rights reserved.