MySQL SUR la mise à JOUR CURRENT_TIMESTAMP pas de mise à jour
J'ai une table qui ressemble à ceci:
CREATE TABLE IF NOT EXISTS `Hosts` (
`id` int(128) NOT NULL AUTO_INCREMENT,
`IP` varchar(15) NOT NULL DEFAULT '',
`Port` varchar(5) NOT NULL DEFAULT '',
`Password` varchar(32) NOT NULL DEFAULT '',
`Username` varchar(32) NOT NULL DEFAULT '',
`Tid` varchar(32) NOT NULL DEFAULT '',
`EquipType` varchar(64) NOT NULL DEFAULT '',
`Version` varchar(128) DEFAULT NULL,
`Status` varchar(10) NOT NULL DEFAULT '',
`Location` varchar(128) NOT NULL DEFAULT '',
`Lastconnection` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`Lastbackup` date NOT NULL DEFAULT '0000-00-00',
`Backupstatus` varchar(64) NOT NULL DEFAULT '',
`Backupmsg` text,
`Backupfile` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `IP` (`IP`),
KEY `Tid` (`Tid`),
KEY `EquipType` (`EquipType`),
KEY `Status` (`Status`),
KEY `Lastbackup` (`Lastbackup`),
KEY `Backupstatus` (`Backupstatus`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=716 ;
Dans mon esprit, cela signifie que chaque fois qu'une ligne est mise à jour, le champ 'Lastconnection" doit être estampillé avec le timestamp actuel. Cependant, lorsque je lance quelque chose comme:
update Hosts set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out' where Tid = 'SITE001'
Lastconnection reste '0000-00-00 00:00:00'. Il y a soit un problème de base de données, je ne vois pas, ou alors je suis complètement à l'incompréhension la mise à JOUR CURRENT_TIMESTAMP clause.
- Quelle est votre version? Je demanderai seulement à cause de ce rapport de bug: bugs.mysql.com/bug.php?id=28904
- On dirait que j'ai 5.1.40.
- Que le ts de la colonne que vous le rapport est rempli avec '0000-00-00 00:00:00' ne contredisent je suppose qu'il pourrait avoir qch. à voir avec le NO_ZERO_DATE mode, mais jetez un oeil à dev.mysql.com/doc/refman/5.0/en/...
- Je pense que peut être il. De nombreuses lignes sont estampillés correctement, mais certains peuvent avoir des valeurs en double. Je vais essayer une mise à niveau.
- Utiliser la valeur null pour la colonne datetime dans la requête a fonctionné pour moi.
- selon dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html le timestamp actuel sera mise à jour que si l'une des valeurs dans les modifications de la ligne (c'est à dire si toutes les valeurs restent les mêmes, les
lastconnection
colonne ne sera pas mise à jour, même si vous exécutezUPDATE
requête)
InformationsquelleAutor coding_hero | 2011-04-06
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé d'utiliser la valeur null pour que le terrain lors de la mise à jour?
Vous pouvez également essayer de définir la valeur par défaut pour
CURRENT_TIMESTAMP
, plutôt que de0000-00-00 00:00:00
.Néanmoins, chaque fois que je veux avoir la création et la mise à jour de temps je l'utilise toujours la suivante:
- Je utiliser
now()
, parce que c'est un alias pourCURRENT_TIMESTAMP
et il est plus court. À la fin, le tableau de structure devientCURRENT_TIMESTAMP
, donc ne vous inquiétez pas.Le truc avec
CREATED
champ est à retenir pour utiliser la valeur null sur les deux champs pourINSERT
états, pourUPDATE
les déclarations qu'il n'est pas nécessaire:null
dans l'instruction de mise à jour. Maintenant, chaque fois que le champ est mis à jour (même lorsque les données n'a pas vraiment changé).UTC_TIMESTAMP()
pour éviter des problèmes avec le serveur MySQL fuseau horaire étant différente à votre demande?Cela pourrait être le cas que l'instruction de mise à jour ne change rien. Si la ligne avec
Tid = 'SITE001'
a déjàBackupstatus
ensemble de'FAIL'
etBackupmsg
ensemble de'Connection timed out'
(peut-être, établies par la sauvegarde précédente tentative), puis MySQL ignorer cette ligne et, par conséquent, ne va pas changer laLastconnection
timestamp.Aussi, je vois
ON UPDATE CURRENT_TIMESTAMP
plus comme une fonctionnalité d'administration pour garder la trace des modifications de données. En tant que programmeur, je voudrais ajouter le timestamp de mise à jour de manière explicite:update Hosts
.set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out', Lastconnection = NOW()
where Tid = 'SITE001'
Vous devez vous rappeler que si aucune valeur n'a été changé sur la mise à jour il ne sera pas mise à l'heure,
Vous devez définir la valeur dans la requête
NOW()
à définir pour le point courant !!!update Hosts set Backupstatus = 'FAIL',Lastconnection = NOW() , Backupmsg = 'Connection timed out' where Tid = 'SITE001'
Rappeler que la valeur doit changer pour que le courant timbre de temps pour changer.
Pour spécifier automatique de propriétés, utilisez le
DEFAULT CURRENT_TIMESTAMP
etON UPDATE CURRENT_TIMESTAMP
clauses. L'ordre des clauses n'a pas d'importance. Si les deux sont présents dans la définition d'une colonne, soit peut se produire en premier. L'un des synonymes pourCURRENT_TIMESTAMP
ont la même signification queCURRENT_TIMESTAMP
. Ce sontCURRENT_TIMESTAMP()
,NOW()
,LOCALTIME
,LOCALTIME()
,LOCALTIMESTAMP
, etLOCALTIMESTAMP()
.Utilisation de
DEFAULT CURRENT_TIMESTAMP
etON UPDATE CURRENT_TIMESTAMP
est spécifique àTIMESTAMP
. LeDEFAULT
clause peut également être utilisé pour spécifier une constante (nonautomatic) valeur par défaut; par exemple,DEFAULT 0
ouDEFAULT '2000-01-01 00:00:00'
.DEFAULT 0
ne fonctionnent pas si leNO_ZERO_DATE
SQL-mode est activé parce que le mode de causes “zéro” des valeurs de date (spécifié, par exemple, que 0 '0000-00-00 00:00:00') pour être rejeté. Sachez que leTRADITIONAL
mode SQL comprendNO_ZERO_DATE
.En outre, vous pouvez initialiser ou mettre à jour toute
TIMESTAMP
colonne pour la date et l'heure actuelles en lui assignant uneNULL
valeur, sauf s'il a été défini avec leNULL
attribut pour permettreNULL
valeurs.ON UPDATE CURRENT_TIMESTAMP
ne change pas de mise à jour, n'est-ce pas? Bon de l'information générale sur les horodateurs; mauvaise réponse à cette question.Si vous voulez l'enregistrer pour mettre automatiquement à jour l'horodatage quand l'enregistrement est changé, voici les quatre étapes simples que vous devez accomplir (peut-être en une seule étape, en fonction de si vous utilisez la ligne de commande ou l'interface utilisateur à administrer):
Maintenant le champ qui contient le timestamp sera toujours mis à jour le timestamp actuel chaque fois que l'enregistrement est mis à jour.