Si vous avez déjà essayé d’avoir au sein d’une même table MySQL deux colonnes de type TIMESTAMP qui utilisent CURRENT_TIMESTAMP comme valeur par défaut, vous vous êtes certainement heurté au message suivant :
there can be only one TIMESTAMP column with CURRENT_TIMESTAMP
MySQL interdit en effet d’avoir deux colonnes qui se mettent à jour avec la date par défaut.
C’est particulièrement gênant pour ceux qui, comme moi, ont besoin d’un champ contenant la date d’insertion ET la date de mise à jour d’un enregistrement.
Jusqu’à il y a peu, je contournais à contrecoeur ce problème en gérant la date d’insertion via l’applicatif plutôt que via la base de donnée.
Au cours d’une récente insomnie, j’ai eu l’idée de contourner cette limitation via un trigger MySQL.
Le principe est que la table n’a pas de valeur par défaut pour le champs « date_insert » MAIS que cette valeur est insérée automatiquement via un trigger.
Vu qu’un exemple vaut mieux qu’un long discour, voici comment contourner le problème :
CREATE TABLE sample_table (
id TINYINT(4) NOT NULL AUTO_INCREMENT,
xxx VARCHAR(255) NOT NULL DEFAULT ‘value’,
date_insert TIMESTAMP NULL DEFAULT NULL,
date_lastupdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
CREATE TRIGGER sample_table_on_insert BEFORE INSERT
ON sample_table
FOR EACH ROW
SET NEW.date_insert = CURRENT_TIMESTAMP
Lorsque vous insérer un record dans cette table
INSERT INTO sample_table (xxx) VALUES (‘test’);
vous pouvez voir que date_insert ET date_lastupdate ont l’heure d’insertion
Si vous mettez la table à jour
UPDATE sample_table SET xxx=’test2′ WHERE xxx=’test’
vous pouvez constater que date_insert a toujours l’heure d’insertion date_lastupdate a bien l’heure de mise à jour