Comment avoir deux colonnes qui utilisent CURRENT_TIMESTAMP au sein d’une table MySQL


Web / mercredi, septembre 1st, 2010

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