2009-08-03 68 views
1

我想在MySQL中建立一个触发器,它会做两件事情:如果论坛的主题是位于垃圾或者被隐藏,删除,移到别的地方的话题回收站。问题是如何在'delete delete'触发器中停止删除操作?MySQL的触发器:移至回收站

回答

2

我不知道是否有防止删除,一旦它已经被调用而不引发某种异常的方式。

我想一个更好的解决办法可能是,而不是调用删除要垃圾桶/删除您应该更新的字段,如“IsTrashed”为TRUE记录。然后在更新触发器中查看它是否为TRUE并再次设置为TRUE(例如IF(OLD.IsTrashed && NEW.IsTrashed))。如果是,请删除它,否则将其移至垃圾箱。

这种方法产生的唯一问题是,如果更新已删除项目的不同字段(例如PostDate),则NEW.IsTrashed和OLD.IsTrashed都将为TRUE,因此它可能看起来像您试图删除它,但你只是更新PostDate。您可以检查,这是被修改(例如,通过检查OLD.SomeField <> NEW.SomeField为每个其他字段)的唯一字段或使用一个字段,将始终复位它的值设置为NULL的UPDATE语句之后。像“TrashNow”。这样,如果TrashNow具有真值,那么您知道您确实想要垃圾场。

然而,“正在重置场”只是浪费空间,我认为这个问题的最佳解决方案是一个stored procedure ...类似:

CREATE PROCEDURE DeletePost (IN APostID INT) 
BEGIN 
    IF ((SELECT InTrash FROM posts WHERE PostID = APostID LIMIT 1)) 
    DELETE FROM posts WHERE PostID = APostID; 
    ELSE IF 
    UPDATE posts SET InTrash = TRUE WHERE PostID = APostID; 
    END IF; 
END; 

假设你有表职位与字段帖子ID(INT)和InTrash(任意整数型)。

你会调用这个像这样删除后与123帖子ID:

CALL DeletePost(123); 
+0

谢谢你,这不正是我想要的,但它确实我需要什么:) – Thinker 2009-08-04 08:52:09