2009-08-03 7 views
1

Je veux créer un trigger dans MySQL qui fera deux choses: si le sujet du forum est situé dans la corbeille ou qu'il est caché, supprimez-le, ailleurs déplacez le sujet vers la corbeille. La question est de savoir comment arrêter l'action de suppression dans le déclencheur «avant suppression»?MySQL triggers: move to trash

Répondre

2

Je ne sais pas s'il existe un moyen d'empêcher la suppression une fois qu'elle a déjà été appelée sans déclencher une exception de quelque sorte.

Je pense qu'une meilleure solution pourrait être au lieu d'appeler suppression sur l'enregistrement que vous voulez jeter/supprimer, vous devriez mettre à jour un champ tel que "IsTrashed" à TRUE. Ensuite, dans le déclencheur de mise à jour, vérifiez s'il était déjà VRAI et remis à TRUE à nouveau (par exemple, IF(OLD.IsTrashed && NEW.IsTrashed)). Si oui, supprimez-le, sinon placez-le dans la corbeille. Le seul problème qui découlera de cette méthode est que si vous mettez à jour un champ différent (par exemple, PostDate) d'un élément dans la corbeille, NEW.IsTrashed et OLD.IsTrashed auront tous les deux la valeur TRUE, ainsi vous aurez peut-être l'impression d'essayer de supprimer mais vous ne mettez à jour que le PostDate. Vous pouvez vérifier que c'est le seul champ qui a été modifié (par exemple en vérifiant OLD.SomeField <> NEW.SomeField pour tous les autres champs) ou utiliser un champ qui réinitialisera toujours sa valeur à NULL après une instruction UPDATE. Quelque chose comme "TrashNow". De cette façon, si TrashNow a une valeur TRUE, vous savez que vous avez intentionnellement voulu détruire le champ.

Cependant, ce « champ reseting » est juste l'espace gaspillé, je pense que la meilleure solution pour ce problème est un stored procedure ... quelque chose comme:

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; 

En supposant que vous avez la table messages avec la champs PostID (INT) et InTrash (tout type d'entier).

Vous appelez cela comme pour ainsi supprimer le message avec PostID 123:

CALL DeletePost(123); 
+0

Merci, ce n'est pas exactement ce que je voulais, mais il fait ce que je avais besoin :) – Thinker

Questions connexes