我想在MySQL中创建一个触发器,它将执行两项操作:如果论坛的主题位于垃圾箱或隐藏,删除它,其他地方将主题移至垃圾箱。问题是如何在“删除前”触发器中停止删除操作?
答案 0 :(得分:2)
我不知道是否有一种方法可以在没有引发某种异常的情况下阻止删除。
我认为更好的解决方案可能是在您要删除/删除的记录上调用delete而不是将“IsTrashed”等字段更新为TRUE。然后在更新触发器中,查看它是否已经为TRUE并再次设置为TRUE(例如IF(OLD.IsTrashed && NEW.IsTrashed)
)。如果是,请将其删除,否则将其移至废纸篓。
此方法产生的唯一问题是,如果更新已删除项目的其他字段(例如PostDate),则NEW.IsTrashed和OLD.IsTrashed都将为TRUE,因此您可能看起来正在尝试删除它,但您只是更新PostDate。您可以检查这是唯一被修改的字段(例如,通过检查每个其他字段的OLD.SomeField <> NEW.SomeField
)或使用在UPDATE语句后始终将其值重置为NULL的字段。像“TrashNow”之类的东西。这样,如果TrashNow有一个TRUE值,你知道你故意想要删除该字段。
然而,“重置字段”只是浪费空间,我认为这个问题的最佳解决方案是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;
假设您的表格帖子的字段为 PostID (INT)和 InTrash (任何整数类型)。
您可以这样称呼删除PostID 123的帖子:
CALL DeletePost(123);