105 votes

Quand est-ce qu'un horodatage (auto) est mis à jour?

Si j'ai une colonne dans une table de type TIMESTAMP et qu'elle a comme valeur par défaut : CURRENT_TIMESTAMP, est-ce que cette colonne est mise à jour avec le timestamp actuel si je mets à jour la valeur de n'importe quelle autre colonne dans la même ligne ?
Il semble que ce ne soit pas le cas mais je ne suis pas sûr que c'est ce qui devrait se produire.
Je ne peux pas comprendre ce que cela signifie (de la documentation MySQL):

Si la colonne est auto-mise à jour, elle est automatiquement mise à jour avec le timestamp actuel lorsque la valeur de n'importe quelle autre colonne dans la ligne est modifiée par rapport à sa valeur actuelle. La colonne reste inchangée si toutes les autres colonnes sont définies sur leurs valeurs actuelles. Pour empêcher la mise à jour de la colonne lorsque les autres colonnes changent, définissez-la explicitement sur sa valeur actuelle. Pour mettre à jour la colonne même lorsque les autres colonnes ne changent pas, définissez-la explicitement sur la valeur qu'elle devrait avoir]2

183voto

Ollie Jones Points 20488

Donnez la commande SHOW CREATE TABLE whatever

Ensuite, regardez la définition de la table.

Il a probablement une ligne comme celle-ci

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

dedans. DEFAULT CURRENT_TIMESTAMP signifie que tout INSERT sans réglage explicite de l'horodatage utilise l'heure actuelle. De même, ON UPDATE CURRENT_TIMESTAMP signifie que toute mise à jour sans un horodatage explicite entraîne une mise à jour de la valeur d'horodatage actuelle.

Vous pouvez contrôler ce comportement par défaut lors de la création de votre table.

Ou, si la colonne de timestamp n'a pas été créée correctement au départ, vous pouvez la changer.

ALTER TABLE whatevertable
     CHANGE whatevercolumn 
            whatevercolumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;

Cela entraînera automatiquement la mise à jour de votre colonne de timestamp pour les opérations INSERT et UPDATE sur la table. Si vous souhaitez mettre à jour whatevertable sans modifier le timestamp, c'est-à-dire,

Pour empêcher la colonne de se mettre à jour lorsque d'autres colonnes changent

alors vous devez effectuer ce genre de mise à jour.

UPDATE whatevertable
   SET something = 'nouvelle valeur',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'valeur de l'index'

Cela fonctionne avec les colonnes TIMESTAMP et DATETIME. (Avant la version MySQL 5.6.5, cela ne fonctionnait qu'avec les TIMESTAMPs) Lorsque vous utilisez des TIMESTAMPs, les fuseaux horaires sont pris en compte : sur une machine serveur correctement configurée, ces valeurs sont toujours stockées en UTC et traduites en heure locale lors de la récupération.

15voto

juergen d Points 85039

Je pense que vous devez définir la colonne timestamp comme ceci

CREATE TABLE t1 
(
    ts TIMESTAMP DEFAULT CURRENT\_TIMESTAMP **SUR MISE À JOUR CURRENT\_TIMESTAMP**
);

Voir ici

12voto

Alexander Points 518

Une colonne auto-actualisée est automatiquement mise à jour avec l'horodatage actuel lorsque la valeur de n'importe quelle autre colonne de la ligne est modifiée par rapport à sa valeur actuelle. Une colonne auto-actualisée reste inchangée si toutes les autres colonnes sont définies sur leurs valeurs actuelles.

Pour l'expliquer, imaginons que vous n'avez qu'une seule ligne :

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------

Maintenant, si vous exécutez la mise à jour suivante :

 update my_table
 set price = 2

cela ne modifiera pas la valeur de updated_at, car la valeur de price n'a pas été effectivement modifiée (elle était déjà à 2).

Mais si vous avez une autre ligne avec une valeur de price différente de 2, alors la valeur de updated_at de cette ligne (avec price <> 3) sera mise à jour à CURRENT_TIMESTAMP.

4voto

BrinkDaDrink Points 528

Ajout d'où trouver UPDATE CURRENT_TIMESTAMP car pour les nouveaux utilisateurs c'est une confusion.

La plupart des gens utiliseront phpmyadmin ou quelque chose de similaire.

Vous sélectionnez la valeur par défaut CURRENT_TIMESTAMP.

Attributs (un autre menu déroulant) vous sélectionnez UPDATE CURRENT_TIMESTAMP

4voto

Ajouter un déclencheur dans la base de données:

DELIMITER //
CREATE TRIGGER update_user_password 
  BEFORE UPDATE ON users
  FOR EACH ROW
    BEGIN
      IF OLD.password <> NEW.password THEN
        SET NEW.password_changed_on = NOW();
      END IF;
    END //
DELIMITER ;

L'heure de modification du mot de passe ne sera mise à jour que lorsque la colonne du mot de passe est modifiée.

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