2011-09-29 45 views
10

我看了这个article,但它似乎不适用于删除。试图创建触发器,当我得到这个错误:如何编写触发器以中止MYSQL中的删除?

Executing SQL script in server

ERROR: Error 1363: There is no NEW row in on DELETE trigger

CREATE TRIGGER DeviceCatalog_PreventDeletion 
BEFORE DELETE on DeviceCatalog 
FOR EACH ROW 
BEGIN 
    DECLARE dummy INT; 

    IF old.id = 1 or old.id =2 THEN 
     SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=NEW.id; 
    END IF; 
END; 

SQL script execution finished: statements: 4 succeeded, 1 failed

+0

NEW.fieldname存在;当你删除没有新的数据库时!该错误是明显的:你不能使用NEW.id因为新的未在DELETE触发 – Marco

+1

允许根据连锁报道的选择statatement应该失败 - 你的SELECT语句读起来就像一个真实的,而不是像'选择到假'从意欲失败的文章中。 – miherrma

回答

17

尝试是这样的 - 而不是通过调用你可能预示着你的自定义错误消息不存在的程序产生错误

DELIMITER $$ 

CREATE TRIGGER trigger1 
BEFORE DELETE 
ON table1 
FOR EACH ROW 
BEGIN 
    IF OLD.id = 1 THEN -- Abort when trying to remove this record 
    CALL cannot_delete_error; -- raise an error to prevent deleting from the table 
    END IF; 
END 
$$ 

DELIMITER ; 
+0

简单而正是我想要的!非常感谢 ! – JatSing

+1

MySQL已经添加了SIGNAL命令来引发错误。我认为这是在这个答案后添加的。如果有人有兴趣:http://dev.mysql.com/doc/refman/5.5/en/signal.html – cgTag

+0

伟大的除了@MathewFoscarini,我刚刚重新回答使用Devart的答案,你建议的SIGNAL命令的问题。 – mathielo

2

由于错误说:有上删除没有新的变量。

你只能在插入和更新使用new.id。改用old.id。

SELECT * FROM DeviceCatalog WHERE DeviceCatalog.id=old.id; 
6

那么,错误消息告诉你很清楚:在DELETE触发器中没有新的。

  • INSERT触发器中,你可以与新接入的新值..
  • 在一个UPDATE触发器可以与新接入的新值,旧的有 - 你猜对了 - 老了。
  • 在DELETE触发你可以用OLD存取权限旧值..

它仅仅是没有意义的有新的DELETE,就像老在INSERT是没有意义的。

12

提高@ ​​Devart的(接受)与@ MathewFoscarini的评论关于MySQL SIGNAL Command答案。

DELIMITER $$ 

CREATE TRIGGER DeviceCatalog_PreventDeletion 
BEFORE DELETE ON DeviceCatalog 
FOR EACH ROW 
BEGIN 

    IF old.id IN (1,2) THEN -- Will only abort deletion for specified IDs 
    SIGNAL SQLSTATE '45000' -- "unhandled user-defined exception" 
     -- Here comes your custom error message that will be returned by MySQL 
     SET MESSAGE_TEXT = 'This record is sacred! You are not allowed to remove it!!'; 
    END IF; 

END 
$$ 

DELIMITER ; 

被选为MySQL's Reference Manual的SQLSTATE 45000提示:

To signal a generic SQLSTATE value, use '45000', which means “unhandled user-defined exception.”

这样您的自定义信息将被显示给用户时,它会尝试删除记录ID 12。另外,如果没有记录应该从表中删除,您可以删除IF .. THENEND IF;行。这将阻止ANY记录从表中删除。当您插入或更新的记录