web-dev-qa-db-fra.com

Obtenir l'heure de la dernière mise à jour d'une colonne

Cette commande donne la date de la dernière mise à jour d'une table

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'MyDB'
AND TABLE_NAME = 'MyTable'

Mais je veux trouver l'heure de la dernière mise à jour d'une colonne particulière d'une table. Je ne peux pas utiliser de déclencheurs car je veux connaître l'heure de la dernière mise à jour d'une colonne spécifique d'une table système.

J'espère avoir bien expliqué mon problème.

6
Fox

Aucune des tables système (c'est-à-dire rien dans la base de données INFORMATION_SCHEMA ) ne contient ce type d'informations enregistrées n'importe où. En d'autres termes, il n'y a pas de mécanisme natif pour mettre des horodatages sur les changements de colonne. Chaque fois que

  • une ou plusieurs colonnes changent dans n'importe quelle ligne
  • une nouvelle ligne est ajoutée
  • un ancien est supprimé
  • une ALTER TABLE de toute nature

le UPDATE_TIME colonne dans INFORMATION_SCHEMA.TABLES est mis à jour.

SUGGESTION

Cela peut être une pilule amère à avaler, mais vous devez faire ce qui suit:

  • Créez une table personnalisée qui enregistre
    • clé primaire
    • nom de colonne
    • l'ancienne valeur de cette colonne
    • la nouvelle valeur de cette colonne
    • horodatage du changement
  • Créer BEFORE UPDATE déclencheur pour comparer les anciennes et les nouvelles colonnes et les enregistrer si elles ne correspondent pas

ÉPILOGUE

Cela peut ne pas être si mauvais si vous personnalisez quelques tables et quelques colonnes.

6
RolandoMySQLDBA

Vous pouvez modifier votre table afin qu'elle stocke l'horodatage chaque fois qu'elle est mise à jour. Par exemple

CREATE TABLE foo (
  id INT PRIMARY KEY
  x INT,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
                     ON UPDATE CURRENT_TIMESTAMP,
  KEY (updated_at)
);

Le code ci-dessus stocke l'horodatage actuel sur une nouvelle ligne et le change l'heure éditée chaque fois qu'une ligne est éditée. De cette façon, vous pouvez obtenir les données, les trier (order by) en mode descending et obtenir le premier enregistrement. De cette façon, vous obtenez le dernier enregistrement mis à jour dans votre table. Si vous voulez connaître l'ensemble de la base de données, vous devez comparer le dernier enregistrement mis à jour pour chacune de vos tables et obtenir le plus récent.

3
John Demetriou