web-dev-qa-db-fra.com

Quand un horodatage (auto) est-il mis à jour?

Si j'ai une colonne dans une table de type TIMESTAMP et que sa valeur par défaut est: CURRENT_TIMESTAMP cette colonne est-elle mise à jour avec l'horodatage actuel si je mets à jour la valeur de any autre colonne dans la même ligne?
Il semble que ce ne soit pas le cas, mais je ne suis pas sûr que ce soit ce qui devrait arriver.
Je ne comprends pas ce que cela signifie ( de la documentation MySQL ):

Si la colonne est mise à jour automatiquement, elle est automatiquement mise à jour avec l'horodatage actuel lorsque la valeur d'une autre colonne de 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 colonne de se mettre à jour lorsque d'autres colonnes changent, définissez-la explicitement à 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

63
Jim

Donne la commande SHOW CREATE TABLE whatever

Ensuite, regardez le définition de la table .

Il a probablement une ligne comme celle-ci

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

en elle. DEFAULT CURRENT_TIMESTAMP signifie que tout INSERT sans paramètre d’horodatage explicite utilise l’heure actuelle. Également, ON UPDATE CURRENT_TIMESTAMP signifie que toute mise à jour sans 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 d'horodatage n'a pas été créée correctement, vous pouvez la modifier.

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

Ainsi, les opérations INSERT et UPDATE de la table mettront automatiquement à jour votre colonne timestamp. Si vous voulez mettre à jour whatevertable sans changer l’horodatage, c’est-à-dire que

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

alors vous devez publier ce type de mise à jour.

UPDATE whatevertable
   SET something = 'newvalue',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'indexvalue'

Et cela fonctionne uniquement avec les colonnes TIMESTAMP, pas avec les colonnes DATETIME ou DATE. Comme les colonnes sont TIMESTAMPs, les fuseaux horaires sont comptabilisés: sur un serveur correctement configuré, ces valeurs sont toujours stockées au format UTC et traduites en heure locale lors de la récupération.

106
O. Jones

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

 CREATE TABLE t1 
 (
 Ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
); 

Voir ici

12
juergen d

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 ;

Le mot de passe changé heure ne sera mis à jour que lorsque la colonne mot de passe est changé.

3

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

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

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

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

 update my_table
 set price = 2

cela ne changera pas la valeur de updated_at, puisque la valeur du prix n'a pas réellement changé (elle était déjà 2).

Mais si vous avez une autre ligne avec une valeur de prix autre que 2, la valeur updated_at de cette ligne (avec un prix <> 3) sera mise à jour à CURRENT_TIMESTAMP.

1
Alexander

Ajouter où trouver UPDATE CURRENT_TIMESTAMP parce que pour les nouveaux venus, c'est une confusion.

La plupart des gens vont utiliser phpmyadmin ou quelque chose comme ça.

Valeur par défaut que vous sélectionnez CURRENT_TIMESTAMP

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

0
BrinkDaDrink