RootsLabs

More than a tool ! GitHub Google+ LinkedIn RSS

MySQL : Comment savoir quand un champ a été mis à jour ?

Progi1984 - Commentaires (1)

MySQL est une référence dans le monde de l’Open Source et de la base de données. Une de ces spécificités est le trigger. Mais qu’est ce donc ? Un trigger se déclenche avant ou après une requête (SELECT, INSERT, UPDATE et DELETE). Dans notre cas, nous allons utiliser les triggers pour savoir quand une ligne a été insérée ou mise à jour dans une table.

MySQL

MySQL : Avoir les bonnes colonnes

Pour cela il nous faut deux colonnes : l’une quand la ligne sera créée et l’autre quand la ligne sera mise à jour.
Je préfère définir ces deux colonnes dans le type : timestamp.

ALTER TABLE `matable` ADD `tbl_created` TIMESTAMP NULL DEFAULT NULL;
ALTER TABLE `matable` ADD `tbl_updated` TIMESTAMP NULL DEFAULT NULL;

Et voilà, votre table a deux colonnes vides.

MySQL : Définir les triggers

Le premier trigger interviendra au moment de la requête INSERT pour lui définir le contenu de colonne tbl_created.
Après insertion, la colonne tbl_created contiendra la date d’insertion, et NULL pour la colonne tbl_updated.

DELIMITER |
DROP TRIGGER IF EXISTS `matable_tbl_created`|
CREATE TRIGGER `matable_tbl_created` BEFORE INSERT ON `matable` FOR EACH ROW 
BEGIN 
    SET NEW.tbl_created = NOW(); 
END|
DELIMITER ;

Le second trigger interviendra au moment de la requête UPDATE pour lui définir le contenu de colonne tbl_updated.
Après mise à jour de la ligne, la colonne tbl_updated contiendra la date de mise à jour.

DELIMITER |
DROP TRIGGER IF EXISTS `matable_tbl_updated`|
CREATE TRIGGER `matable_tbl_updated` BEFORE UPDATE ON `matable` FOR EACH ROW 
BEGIN
    SET NEW.tbl_updated = NOW();
END|
DELIMITER ;

MySQL : Et si on testait ?

Voici la table au départ :
MySQL : Table au début

On y ajoute nos deux colonnes et les triggers :
MySQL : Table après les requêtes ALTER

Ensuite, j’insère une ligne :
MySQL : Table après les requêtes INSERT

PS : On voit bien que le champ tbl_created est rempli, mais pas le champ tbl_updated.

Ensuite, je mets à jour cette même ligne :
MySQL : Table après les requêtes UPDATE

PS : On voit que le champ tbl_created n’a pas bougé, mais que le champ tbl_updated a été mis à jour avec l’heure courante.

Conclusion

Désormais, vous saurez quand votre ligne aura été insérée et mise à jour. Je pense que certains de vos debugs vous remercieront.

Commentaires

1. Antoine, le 16 décembre 2013 à 10:53

Merci !

Ajouter un commentaire

Commentaire :