web-dev-qa-db-fra.com

MySQL stocke automatiquement la date/heure pour chaque ligne

En MySQL, j'en ai marre d'ajouter les colonnes dt_created et dt_modified (qui sont des horodatages pour la création et la dernière modification, respectivement) à toutes les tables de ma base de données.

Chaque fois que je INSERT ou UPDATE la base de données, je devrai utiliser le mot clé NOW(). Cela va partout dans ma persistance. 

Existe-t-il une alternative efficace permettant à MySQL de stocker automatiquement au moins le temps de la ligne insérée et de me le récupérer?

41
mauris

Vous pouvez utiliser les contraintes DEFAULT pour définir l'horodatage:

ALTER TABLE
 MODIFY dt_created datetime DEFAULT CURRENT_TIMESTAMP

ALTER TABLE
 MODIFY dt_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Il ne serait alors pas nécessaire de spécifier NOW() dans vos instructions INSERT/UPDATE.

Référence: Propriétés TIMESTAMP

73
OMG Ponies

Si vous utilisez phpmyadmin vous pouvez le faire en:

enter image description here

10
Ouadie
ALTER TABLE  `tablename` CHANGE  `dt`  `dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

devrait être le bon code.

7
Kim Stacks

Eh bien, vous ne pouvez pas avoir les deux:

doc mysql:

Il n'est pas possible que l'horodatage actuel soit la valeur par défaut pour une colonne et la valeur de mise à jour automatique pour une autre colonne. 

Triste, n'est-ce pas?

Vous pouvez cependant utiliser null à la place de now () en suivant ce conseil

3
ggd

Une question similaire a été posée ici " Timestamp for MySQL " le champ timestamp sera mis à jour à chaque accès. Vous pouvez également envisager de placer un Trigger sur la table en question pour renseigner automatiquement ces champs. En fonction de l'environnement, certains magasins/entreprises n'apprécient pas l'utilisation de déclencheurs et vous devrez peut-être trouver d'autres solutions de rechange.

1
GrayWizardx

Dans phpmyadmin, vous pouvez définir enter image description here

OU Utilisez cette requête

ALTER TABLE  `tablename`
    CHANGE  `dt_created`  `dt_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
0
user3110005