簡體   English   中英

在MySQL中觸發“刪除前”

[英]Trigger in MySQL “BEFORE DELETE”

刪除記錄給我下面的錯誤:

錯誤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”表中的所有記錄,其中包含由“ 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”的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM