Dans le pied de page de ma page, je voudrais ajouter quelque chose comme "dernière mise à jour le xx / xx / 200x" avec cette date étant la dernière fois qu'une certaine table mySQL a été mise à jour.
Quelle est la meilleure façon de le faire? Existe-t-il une fonction pour récupérer la dernière date de mise à jour? Dois-je accéder à la base de données chaque fois que j'ai besoin de cette valeur?
Réponses:
Dans les versions ultérieures de MySQL, vous pouvez utiliser la
information_schema
base de données pour vous dire quand une autre table a été mise à jour:Cela signifie bien sûr l'ouverture d'une connexion à la base de données.
Une autre option serait de "toucher" un fichier particulier chaque fois que la table MySQL est mise à jour:
Sur les mises à jour de la base de données:
O_RDRW
modeclose
ça encoreOu bien
touch()
, l'équivalent PHP de lautimes()
fonction, pour modifier l'horodatage du fichier.Affichage sur la page:
stat()
pour relire l'heure de modification du fichier.la source
show table status
utiliseinformation_schema.tables
)UPDATE_TIME
méthode et lashow table status
méthode ci-dessous sont disponibles uniquement avec le moteur MyISAM, pas InnoDB. Bien que cela soit répertorié comme un bogue , il est mentionné dans la référence MySQL 5.5 , qui indique également que lefile_per_table
mode est un indicateur peu fiable de l'heure de modification.Je n'ai pas de base de données information_schema, en utilisant mysql version 4.1.16, donc dans ce cas, vous pouvez interroger ceci:
Il renverra ces colonnes:
Comme vous pouvez le voir, il existe une colonne appelée: " Update_time " qui vous montre l'heure de la dernière mise à jour de votre_table .
la source
Je suis surpris que personne n'ait suggéré de suivre l'heure de la dernière mise à jour par ligne:
Cela met à jour l'horodatage même si nous ne l'avons pas mentionné dans la mise à jour.
Vous pouvez maintenant interroger le MAX ():
Certes, cela nécessite plus de stockage (4 octets par ligne pour TIMESTAMP).
Mais cela fonctionne pour les tables InnoDB antérieures à la version 5.7.15 de MySQL, ce qui
INFORMATION_SCHEMA.TABLES.UPDATE_TIME
ne fonctionne pas.la source
La chose la plus simple serait de vérifier l'horodatage des fichiers de table sur le disque. Par exemple, vous pouvez vérifier sous votre répertoire de données
Cela devrait vous donner la liste de toutes les tables avec la table lors de la dernière modification la plus ancienne, en premier.
la source
Pour une liste des modifications récentes de la table, utilisez ceci:
la source
UPDATE_TIME
sont nuls? Une idée?Je créerais un déclencheur qui attrape toutes les mises à jour / inserts / suppressions et j'écrirais l'horodatage dans une table personnalisée, quelque chose comme tablename | horodatage
Juste parce que je n'aime pas l'idée de lire directement les tables système internes du serveur db
la source
UPDATE_TIME
colonne comme dans MySQL.Bien qu'il y ait une réponse acceptée, je ne pense pas que ce soit la bonne. C'est le moyen le plus simple de réaliser ce qui est nécessaire, mais même s'il est déjà activé dans InnoDB (en fait, les documents vous disent que vous devriez toujours obtenir NULL ...), si vous lisez des documents MySQL , même dans la version actuelle (8.0) en utilisant UPDATE_TIME est pas la bonne option, car:
Si je comprends bien (je ne peux pas le vérifier sur un serveur pour le moment), l'horodatage est réinitialisé après le redémarrage du serveur.
En ce qui concerne les solutions réelles (et, enfin, coûteuses), vous avez la solution de Bill Karwin avec CURRENT_TIMESTAMP et j'aimerais en proposer une différente, basée sur des déclencheurs (j'utilise celui-là).
Vous commencez par créer une table séparée (ou peut-être avez-vous une autre table qui peut être utilisée à cet effet) qui fonctionnera comme un stockage pour les variables globales (ici les horodatages). Vous devez stocker deux champs: le nom de la table (ou la valeur que vous souhaitez conserver ici en tant qu'ID de table) et l'horodatage. Une fois que vous l'avez, vous devez l'initialiser avec cet identifiant de table + date de début (NOW () est un bon choix :)).
Maintenant, vous passez aux tables que vous souhaitez observer et ajoutez des déclencheurs APRÈS INSERT / UPDATE / DELETE avec cette procédure ou une procédure similaire:
la source
Analyse au niveau du système d'exploitation:
Trouvez où la base de données est stockée sur le disque:
Rechercher les modifications les plus récentes
Devrait fonctionner sur tous les types de bases de données.
la source
Saisissez simplement la date du fichier modifiée à partir du système de fichiers. Dans ma langue c'est:
Production:
la source
Si vous utilisez Linux, vous pouvez utiliser inotify pour consulter la table ou le répertoire de la base de données. inotify est disponible sur PHP, node.js, perl et je soupçonne la plupart des autres langages. Bien sûr, vous devez avoir installé inotify ou l'avoir fait installer par votre FAI. Beaucoup de FAI ne le feront pas.
la source
Je ne sais pas si cela présente un quelconque intérêt. Utiliser mysqlproxy entre mysql et les clients, et utiliser un script lua pour mettre à jour une valeur clé dans memcached en fonction des changements de table intéressants UPDATE, DELETE, INSERT était la solution que j'ai faite assez récemment. Si le wrapper supportait des hooks ou des déclencheurs en php, cela aurait pu être eaiser. Aucun des wrappers ne le fait pour le moment.
la source
J'ai créé une colonne par nom: update-at dans phpMyAdmin et j'ai obtenu l'heure actuelle de la méthode Date () dans mon code (nodejs). à chaque changement dans le tableau, cette colonne contient l'heure des changements.
la source
a) Il vous montrera toutes les tables et les dernières dates de mise à jour
ensuite, vous pouvez en outre demander une table spécifique:
b) Comme dans les exemples ci-dessus, vous ne pouvez pas utiliser le tri sur 'Update_time' mais en utilisant SELECT, vous pouvez:
pour en savoir plus sur une table particulière:
la source
C'est ce que j'ai fait, j'espère que cela aide.
la source
Mettez la requête en cache dans une variable globale lorsqu'elle n'est pas disponible.
Créez une page Web pour forcer le rechargement du cache lorsque vous le mettez à jour.
Ajoutez un appel à la page de rechargement dans vos scripts de déploiement.
la source