web-dev-qa-db-fra.com

MySQL ON UPDATE CURRENT_TIMESTAMP ne se met pas à 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 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".

29
coding_hero

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);
33
barranquero

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'
.

15
Gas Welder

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.

7
Pini Cheyni

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.

1
Nag Hammadi