Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1310 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MYSQL] Update qui oublie des données

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MYSQL] Update qui oublie des données

n°1878397
fafois
Posté le 27-04-2009 à 17:31:58  profilanswer
 

Bonjour,
 
Je suis rompu à l'utilisation de MYSQL et du langage SQL, après 10 ans de pratique voici que pour la première fois je me trouve totalement bloqué alors peut être parviendrez-vous à m'aider :
 
La manœuvre n'a rien de compliquée, j'update une table avec les valeurs contenues dans une autre, voici la requête :
UPDATE Calcul C, PreCalcul P SET C.Val=P.Val, P.Val=0 WHERE C.User=P.User AND C.User=\"".$User."\" AND P.Val > 0
 
Cette requête est appelée dans une boucle while, la valeur de $User change à chaque tour de boucle. L'utilisation d'une boucle plutôt que de faire un seul update pour tous les users découle d'une autre obligation non concernée par ce problème.
 
Mon problème c'est qu'il y-a, pour chaque User, une dizaine de données qui doivent être mises à jour, et que depuis peu (sans n'avoir modifié le code), certaines données pour certains users ne se mettent pas à jour. Les données oubliées sont toujours les mêmes.
 
Le plus étrange, c'est que l'Update oublie ces données quand il tourne en tache Cron et traite des milliers de Users, mais n'oublie aucune donnée quand je le relance la tache Cron à la main pour le User lésé !
 
Une idée ?
 
Merci d'avance.

mood
Publicité
Posté le 27-04-2009 à 17:31:58  profilanswer
 

n°1878407
olivthill
Posté le 27-04-2009 à 17:46:29  profilanswer
 

Peut-être que P.val serait nul et que donc son contenu serait indéterminé.

n°1878420
fafois
Posté le 27-04-2009 à 18:27:45  profilanswer
 

Bien entendu j'ai vérifié que les données oubliées dans l'update sont censées être modifiées, ce qui est d'ailleurs fait quand je relance le script à la main !
 
Je pense qu'un des enregistrements est corrompu, mais des réparations de table n'y font rien. Pour le prochain lancement du script, j'ai isolé l'enregistrement que je pense être fautif, on verra bien si ça marche.
 
Quelqu'un sait s'il peut arriver qu'un doublon soit stocké dans la base malgrés la présence d'une clé primaire (et donc l'impossibilité de doublon) ? Des tests me font penser que j'ai un enregistrement en double qui ne serait pas visible car théoriquement impossible, et ferait planter l'Update !

n°1878443
moi23372
Posté le 27-04-2009 à 20:43:38  profilanswer
 

Vive mySql. Faut passer à quelque chose de sérieux. Quand j'entend ça ça fais peur.


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
n°1878539
casimimir
Posté le 28-04-2009 à 08:29:10  profilanswer
 

et tu as creusé du coté de la casse ou d'un espace qui traine a la fin?

n°1878554
fafois
Posté le 28-04-2009 à 09:21:30  profilanswer
 

:) ce sont des float (pour les Valeurs) et oui, pour le nom du User j'ai vérifié vu que ça marche quand je relance le même script moi même, ça ne peut donc pas venir du script lui-même !


Message édité par fafois le 28-04-2009 à 09:23:29
n°1878563
olivthill
Posté le 28-04-2009 à 09:54:39  profilanswer
 

Citation :

vu que ça marche quand je relance le même script moi même, ça ne peut donc pas venir du script lui-même !

Il ne faut pas être aussi affirmatif. L'environnement n'est pas le même. Les données non initialisées n'ont pas forcément la même valeur. L'un des piège est la gestion des données nulles. Par exemple P.Val peut être supérieur à zéro tout en étant nul, ou bien être égal à zéro en étant nul. Cette requête comporte un risque car elle ne teste pas si P.val est nul ou non avant de tester sa valeur. Mais peut-être que P.val est une donnée qui n'est jamais nulle. Si vous répondiez à la question, alors on pourrait éliminer cette première hypothèse et passer aux autres hypothèses.
 
Les clés primaires sont gérées dans les index. Si un index est corrompu, le plus simple serait de le récréer. Il ne s'agirait pas d'une réparation de table, mais d'une réparation d'index. Je ne sais pas très bien comment cela se fait avec MySQL, mais je suppose qu'il faudrait renommer la table, créer une table comme celle d'origine, et copier les données dans cette nouvelle table.

n°1878875
fafois
Posté le 28-04-2009 à 15:57:20  profilanswer
 

Je confirme, P.Val n'est jamais nul, en tout cas sur les lignes qui bloquent, il ne l'est pas.
 
Sinon merci pour l'idée des index etc, mais j'ai déjà tenté de recréer la table en la remplissant avec la première. Je l'ai fait via une requête (pas de changement), puis via une boucle php qui reremplissait la seconde base données après données, en ayant fait un select distinct sur la clé primaire pour être certain de ne pas avoir de doublons (pas de changement non plus).
 
Au final je suis certain qu'un enregistrement est corrompu, je l'ai viré et ça a réglé le pb, mais je pense qu'il y-en a d'autres que je n'ai pas repéré, donc ma question, existe t'il un moyen de vérifier qu'une table est corrompue et de la corriger (autre que le REPAIR qui ne marche pas dans ce cas) ?


Message édité par fafois le 28-04-2009 à 15:57:57

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MYSQL] Update qui oublie des données

 

Sujets relatifs
php:récupérer des données d'une autre pageEnregistrer date format fr dans BDD MySQL
[MySQL] too many connections[C] Créer un tableau + trier des données avant envoi
Problème MYSQL et faire des pagesExtraire que certaines données d'un fichier csv
Probleme de synthaxe en mysql/JSPProblème pour supprimer article en PHP/MySQL
Debutante : modification des données d'une bdd sous phpmatlab lecture données .csv
Plus de sujets relatifs à : [MYSQL] Update qui oublie des données


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR