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
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);
- 1. Evénement C# Form Move Stopped
- 2. Syntaxe MySQL à la syncronisation de schéma via des triggers?
- 3. MySQL triggers + réplication avec plusieurs bases de données
- 4. mbox to mysql
- 5. VEMap Pan triggers VEMap.onclick
- 6. Triggers imbriqués de UpdatePanel
- 7. Jquery Reliure et Triggers
- 8. WPF Expanders Triggers
- 9. MySQL to SQL Server 2005
- 10. Svn Move n'apparaît pas dans le menu contextuel
- 11. LINQ to MySql fournisseur de données
- 12. Aide avec mysql str-to-date
- 13. LINQ to DataSets pour MySQL Interop
- 14. Qt4 QSslSocket triggers HTTP 406 responseq
- 15. Tableau de vérification utilisant les triggers
- 16. Isoler les triggers de WPF THemes
- 17. MySQL trouver auteurs sans messages (one-to-many)
- 18. MySQL Drop Down to Return résultat ... semble simple?
- 19. Implémentation de fonctions de triggers à base de table
- 20. Postgresql Triggers: passer d'après à avant le déclenchement DonT feu
- 21. SOAP to Stream to String
- 22. Sql Query to Linq To Sql
- 23. comment interroger many-to-many?
- 24. Exécuter plusieurs instances mysql dans mysql
- 25. L'exécution de la fonction d'écriture mysql results-to-csv ne se termine pas en production
- 26. intégration de php mysql et voip et de text to speech
- 27. Comment identifiez-vous les triggers associés à une table dans une base de données sybase?
- 28. WPF Triggers: Modification d'un hors-champ style de contrôle dans un déclencheur
- 29. Est-il possible d'avoir des étapes de construction post-débogage/triggers en XCode?
- 30. Bibliothèque de triggers AS3 (ou n'importe quelle langue) pour les triangles?
Merci, ce n'est pas exactement ce que je voulais, mais il fait ce que je avais besoin :) – Thinker