删除记录会给我以下错误:


  错误1442:1442:无法更新存储函数/触发器中的表'categoria',因为调用该存储函数/触发器的语句已使用该表。


这是我的触发器:

DROP trigger IF EXISTS tg_eliminarCategoria;
DELIMITER $$
CREATE TRIGGER tg_eliminarCategoria
    BEFORE DELETE ON Categoria
    FOR EACH ROW
BEGIN
    IF NOT EXISTS (SELECT * FROM Categoria WHERE nombreCategoria = 'Sin Categoria') THEN
        INSERT INTO Categoria (nombreCategoria) VALUES ('Sin Categoria');
    END IF;

    SET @idCategoria = (SELECT idCategoria FROM Categoria WHERE nombreCategoria = 'Sin Categoria');
    UPDATE Contacto SET idCategoria=@idCategoria WHERE idCategoria=OLD.idCategoria;
END$$
DELIMITER ;


触发条件是,通过从“ Categoria”表中删除一条记录,它会检查是否存在“ Sin Categoria”记录,如果不存在,则会修改“ Contacto”表中的所有记录,其中包含由The new删除的记录。记录。

对不起,我的英语,我还在学习。

最佳答案

我猜您想确保表格中的“ Sin Categoria”至少有一行。

另一种执行此方法的方法是,如果有人尝试删除“ Sin Categoria”,则引发一个SIGNAL(类似于异常)。

mysql> DROP trigger IF EXISTS tg_eliminarCategoria;
mysql> DELIMITER $$
mysql> CREATE TRIGGER tg_eliminarCategoria
    BEFORE DELETE ON Categoria
    FOR EACH ROW
BEGIN
    IF OLD.nombreCategoria = 'Sin Categoria' THEN
        SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'No debe eliminar la categoría especial: Sin Categoria';
    END IF;
END$$
mysql> DELIMITER ;

mysql> delete from Categoria;
ERROR 1644 (45000): No debe eliminar la categoría especial: Sin Categoria


但是,我认为我有更好的建议。我猜您将其用于必须引用类别的外键,如下所示:

CREATE TABLE Contacto (
  idContacto INT AUTO_INCREMENT PRIMARY KEY,
  idCategoria INT NOT NULL,
  FOREIGN KEY (idCategoria) REFERENCES Categoria(idCategoria)
);


当Contacto没有类别时,可以引用“ Sin类别”行。并且您要确保没有人删除Categoria表中的该行。

相反,当Contacto中的行没有类别时,我建议使用NULL。只需使Contacto.idCategoria允许NULL:

CREATE TABLE Contacto (
  idContacto INT AUTO_INCREMENT PRIMARY KEY,
  idCategoria INT DEFAULT NULL,
  FOREIGN KEY (idCategoria) REFERENCES Categoria(idCategoria)
);

INSERT INTO Contacto
SET idContacto = 1234,
    idCategoria = NULL;


这样,您就无需在Categoria中任何名为“ Sin Categoria”的行。

关于mysql - 在MySQL中触发“删除前”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45248376/

10-09 20:23