如何使删除表数据的触发器验证我们通过扩展名 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 属性中没有任何数据,就像我尝试过的其他数据一样。
任何帮助都会很棒。
仅当记录存在时才会调用删除。因此,如果您尝试删除不存在的 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;
//