gpt4 book ai didi

MySQL 触发器 : move to trash

转载 作者:行者123 更新时间:2023-11-29 07:15:47 25 4
gpt4 key购买 nike

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

最佳答案

我不知道是否有一种方法可以在调用删除后不引发某种异常的情况下阻止删除。

我认为更好的解决方案可能不是在要删除/删除的记录上调用 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;

假设您的表posts 包含字段PostID (INT) 和InTrash(任何整数类型)。

你可以像这样调用它来删除 PostID 为 123 的帖子:

CALL DeletePost(123);

关于MySQL 触发器 : move to trash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com