mysql - MySQL 中的触发器 "BEFORE DELETE"

标签 mysql sql database-trigger

删除记录会出现以下错误:

ERROR 1442: 1442: Can't update table 'categoria' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

这是我的触发器:

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 Category”记录,如果不存在,则修改“Contacto”表中包含该删除记录的所有记录由新纪录。

抱歉我的英语不好,我还在学习。

最佳答案

我猜您想确保表中至少有一行用于“罪孽类别”。

另一种方法是筹集 SIGNAL (就像一个异常(exception))如果有人试图删除“罪孽类别”。

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 中的行没有类别时,我建议使用 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;

那么您不需要在类别中添加任何名为“Sin Category”的行。

关于mysql - MySQL 中的触发器 "BEFORE DELETE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45248376/

相关文章:

php - 从给定的表中显示 isbn、书名、作者(所有书籍作者在一行中)的查询是什么?

基于选择表单的jquery slider

mysql - 计算产品的总值(value)

mysql - 根据列中的逗号分隔值从 MySQL 表中获取记录

mysql - 如果满足条件则忽略其他记录

MySQL-插入一条主键为空的记录,在一台服务器上工作,而不是另一台服务器

mysql - 如何删除外键字段?

mysql - 我该如何修改我的触发器,以便我可以根据部门获取total_employees?

oracle - 在更新后触发器上获取更新列名的有效方法

PHP mysql条件唯一约束?