我想在MySQL中创建一个触发器,它可以做两件事:如果论坛的主题位于垃圾箱中,或者它是隐藏的,删除它,在其他地方将主题移动到垃圾箱。问题是如何在“before delete”触发器中停止删除操作?

最佳答案

我不知道是否有一种方法可以防止删除,一旦它已经被调用而不引发某种异常。
我认为一个更好的解决方案可能是,不要对要丢弃/删除的记录调用delete,而应该将“IsTrashed”等字段更新为TRUE。然后在update触发器中,查看它是否已经为TRUE并再次设置为TRUE(例如IF(OLD.IsTrashed && NEW.IsTrashed))。如果是,请将其删除,否则将其移到垃圾箱中。
此方法将产生的唯一问题是,如果更新已损坏项的其他字段(例如PostDate),NEW.is trashed和OLD.IsTrashed都将为TRUE,因此看起来您可能正在尝试删除它,但您只是在更新PostDate。您可以检查这是唯一被修改的字段(例如,通过检查每个其他字段的OLD.SomeField <> NEW.SomeField),或者使用一个在UPDATE语句之后总是将其值重置为空的字段。像“垃圾”。这样的话,如果TrashNow有一个真正的值,你就知道你是故意想要垃圾场。
然而,“重置字段”只是浪费了空间,我认为解决这个问题的最佳方法是astored 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;

假设您有PostID(INT)和InTrash(任意整数类型)字段的表posts。
你可以这样称呼它来删除PostID 123的帖子:
CALL DeletePost(123);

关于mysql - MySQL触发器:进入垃圾箱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1223126/

10-16 08:06