2009-08-03 12 views
1

フォーラムのトピックがゴミ箱にあるか、隠されている場合は削除し、別の場所に移動するとゴミ箱に移動します。問題は、 'before delete'トリガで削除アクションを停止する方法です。MySQLのトリガ:ゴミ箱に移動

答えて

2

何らかの例外を発生させずに既に呼び出されていれば削除を防ぐ方法があるかどうかはわかりません。

あなたがゴミ箱/削除するレコードで削除を呼び出す代わりに、より良い解決策があると思われます。「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になっても、意図的にそのフィールドをゴミ箱に入れたいと思っていることがわかります。

あなたがテーブルに ポストにを持っていると仮定すると
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; 

:ちょうどスペースを無駄にされた「フィールドがreseting」、私は...この問題に対する最善の解決策がstored procedureあるようなものを考えることが

、フィールドPostID(INT)およびInTrash(任意の整数型)。

あなたはPostID 123で投稿を削除するので、同じようにこれを呼び出します。

CALL DeletePost(123); 
+0

ありがとうございました、これは私が望んでいたまさにありませんが、それは私が必要なものを行います:) – Thinker

関連する問題