133 votes

Avoir une création et mise à jour des colonnes timestamp MySQL 4.0

J’ai le schéma de la table suivante ;

Il échoue avec l’erreur suivante :

Ma question est, puis-je avoir les deux de ces champs ? ou ce que je dois régler manuellement un champ LastUpdated lors de chaque transaction ?

136voto

Robert Gamble Points 41984

À partir de l' MySQL 5.5 documentation:

Une colonne de type TIMESTAMP dans une table peut avoir le timestamp actuel comme valeur par défaut pour l'initialisation de la colonne, comme la mise à jour automatique de la valeur, ou les deux. Il n'est pas possible d'avoir le timestamp actuel être la valeur par défaut pour une colonne et de la mise à jour automatique de la valeur pour une autre colonne.

Les changements dans MySQL 5.6.5:

Auparavant, au plus une colonne de type TIMESTAMP par le tableau pourrait être initialisée automatiquement ou mis à jour à la date et l'heure actuelles. Cette restriction a été levée. Un TIMESTAMP définition de la colonne peut avoir n'importe quelle combinaison de DÉFAUT CURRENT_TIMESTAMP et SUR la mise à JOUR CURRENT_TIMESTAMP clauses. En outre, ces clauses ne peuvent plus être utilisés avec DATETIME définitions de colonne. Pour plus d'informations, voir d'Initialisation Automatique et la mise à Jour de cachet de date et DATETIME.

93voto

Bogdan Gusiev Points 2802

Il y a une astuce pour avoir les deux horodateurs, mais avec une petite limitation.

Vous pouvez utiliser uniquement une des définitions dans une seule table. Créer deux colonnes timestamp comme suit :

Notez qu’il est nécessaire d’entrer dans les deux colonnes au cours de :

27voto

Stephen Walcher Points 2066

Vous pouvez avoir les deux, juste enlever le drapeau « CURRENT_TIMESTAMP » sur le champ créé. Chaque fois que vous créez un nouvel enregistrement dans la table, il suffit d’utiliser « NOW() » d’une valeur.

Ou.

Au contraire, supprimez l’indicateur « ON UPDATE CURRENT_TIMESTAMP » et envoyer le NOW() pour ce champ. Ça fait plus de sens.

27voto

webkraller Points 151

Si vous décidez d’avoir MySQL de gérer la mise à jour des estampilles, vous pouvez configurer un déclencheur de mise à jour le champ à insérer.

MySQL Reference : http://dev.mysql.com/doc/refman/5.0/en/triggers.html

23voto

alien Points 119

C'est de cette façon que vous pouvez avoir automatique et flexible createDate/lastModified champs à l'aide de déclencheurs:

D'abord les définir comme ceci:

CREATE TABLE `entity` (
  `entityid` int(11) NOT NULL AUTO_INCREMENT,
  `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `lastModified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `name` varchar(255) DEFAULT NULL,
  `comment` text,
  PRIMARY KEY (`entityid`),
)

Puis ajouter ces déclencheurs:

DELIMITER ;;
CREATE trigger entityinsert BEFORE INSERT ON entity FOR EACH ROW BEGIN SET NEW.createDate=IF(ISNULL(NEW.createDate) OR NEW.createDate='0000-00-00 00:00:00', CURRENT_TIMESTAMP, IF(NEW.createDate<CURRENT_TIMESTAMP, NEW.createDate, CURRENT_TIMESTAMP));SET NEW.lastModified=NEW.createDate; END;;
DELIMITER ;
CREATE trigger entityupdate BEFORE UPDATE ON entity FOR EACH ROW SET NEW.lastModified=IF(NEW.lastModified<OLD.lastModified, OLD.lastModified, CURRENT_TIMESTAMP);
  • Si vous insérez sans préciser createDate ou lastModified, ils seront égaux et définir le timestamp actuel.
  • Si vous avez la mise à jour sans spécification de createDate ou de dernière modification, la lastModified sera mis à l'horodatage actuel.

Mais ici, c'est la partie agréable:

  • Si vous insérez, vous pouvez spécifier un createDate de plus que le timestamp actuel, permettant les importations depuis les temps anciens, pour bien fonctionner (lastModified sera égal à createDate).
  • Si vous avez la mise à jour, vous pouvez spécifier un lastModified de plus que la valeur précédente ('0000-00-00 00:00:00' fonctionne bien), permettant de mettre à jour une entrée si vous êtes en train de faire des changements cosmétiques (fixation d'une faute de frappe dans un commentaire) et que vous souhaitez garder l'ancienne lastModified date. Cela ne va pas modifier la date de dernière modification.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X