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 l'horodatage actuel. Cependant, lorsque je lance quelque chose comme:
update Hosts set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out' where Tid = 'SITE001'
La dernière connexion reste '0000-00-00 00:00:00'. Il y a soit un problème de base de données que je ne vois pas, soit je comprends totalement mal la clause "ON UPDATE CURRENT_TIMESTAMP".
Avez-vous essayé d'utiliser null pour ce champ lors de la mise à jour?
Vous pouvez également essayer de définir la valeur par défaut sur CURRENT_TIMESTAMP
, Plutôt que sur 0000-00-00 00:00:00
.
Néanmoins, chaque fois que je souhaite avoir un temps de création et de mise à jour, j'utilise toujours les éléments suivants:
...
CREATED timestamp NOT NULL default '0000-00-00 00:00:00',
UPDATED timestamp NOT NULL default now() on update now(),
....
J'utilise now()
, car c'est un alias pour CURRENT_TIMESTAMP
Et il est plus court. À la fin, la structure de la table obtient CURRENT_TIMESTAMP
, Alors ne vous inquiétez pas.
L'astuce avec le champ CREATED
est de ne pas oublier d'utiliser null sur les deux champs pour les instructions INSERT
, pour les instructions UPDATE
ce n'est pas obligatoire:
INSERT INTO mytable (field1, field2, created, updated)
VALUES ('foo', 'bar', null, null);
Il se peut que l'instruction de mise à jour ne change rien. Si la ligne avec Tid = 'SITE001'
a déjà Backupstatus
défini sur 'FAIL'
et Backupmsg
définis sur 'Connection timed out'
(peut-être, défini par une tentative de sauvegarde précédente), alors MySQL sautera cette ligne et ne changera donc pas l'horodatage Lastconnection
.
Aussi, je vois ON UPDATE CURRENT_TIMESTAMP
plus comme une fonction administrative pour suivre les modifications des données. En tant que programmeur, j'ajouterais explicitement la mise à jour de l'horodatage:
update Hosts
.
set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out', Lastconnection = NOW() where Tid = 'SITE001'
Vous devez vous rappeler que si aucune valeur n'était modifiée lors de la mise à jour, elle ne définira pas l'horodatage actuel,
Vous devez définir la valeur dans la requête NOW()
pour définir l'horodatage actuel !!!
update Hosts set Backupstatus = 'FAIL',Lastconnection = NOW() , Backupmsg = 'Connection timed out' where Tid = 'SITE001'
N'oubliez pas que la valeur doit changer pour que l'horodatage actuel puisse changer.
Pour spécifier des propriétés automatiques, utilisez les clauses DEFAULT CURRENT_TIMESTAMP
Et ON UPDATE CURRENT_TIMESTAMP
. L'ordre des clauses n'a pas d'importance. Si les deux sont présents dans une définition de colonne, l'un ou l'autre peut se produire en premier. Tous les synonymes de CURRENT_TIMESTAMP
Ont la même signification que CURRENT_TIMESTAMP
. Ce sont CURRENT_TIMESTAMP()
, NOW()
, LOCALTIME
, LOCALTIME()
, LOCALTIMESTAMP
et LOCALTIMESTAMP()
.
L'utilisation de DEFAULT CURRENT_TIMESTAMP
Et ON UPDATE CURRENT_TIMESTAMP
Est spécifique à TIMESTAMP
. La clause DEFAULT
peut également être utilisée pour spécifier une valeur par défaut constante (non automatique); par exemple, DEFAULT 0
ou DEFAULT '2000-01-01 00:00:00'
.
DEFAULT 0
Ne fonctionne pas si le mode SQL NO_ZERO_DATE
Est activé car ce mode provoque des valeurs de date "zéro" (spécifiées, par exemple, comme 0 '0000-00-00 00:00:00' ) à rejeter. N'oubliez pas que le mode SQL TRADITIONAL
inclut NO_ZERO_DATE
.
De plus, vous pouvez initialiser ou mettre à jour n'importe quelle colonne TIMESTAMP
à la date et à l'heure actuelles en lui affectant une valeur NULL
, sauf si elle a été définie avec l'attribut NULL
pour permettre NULL
valeurs.