[MySQL] LOOP

LOOP [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 05-07-2014 à 13:42:49    

Salut à tous  :bounce:  
 
Voilà, j'ai une table mysql "educateurs" où, pour chaque modification d'enregistrement, je ne fais pas un UPDATE mais un INSERT INTO afin de pouvoir afficher l'historique des modifications. Grosso modo, ça donne ça :
 
Mise à jour d'un educateur :

Code :
  1. INSERT INTO educateurs VALUES (
  2. '', -> nouvel identifiant généré automatiquement
  3. '$id', -> ancien identifiant
  4. (..données diverses..),
  5. '1' -> flag indiquant que l'enregistrement estactif.
  6. );
  7. UPDATE educateurs SET actif='0' WHERE id='$id';
  8. -> je mets à jour l'ancien enregistrement pour indiquer qu'il n'est plus actif.


 
En gros, à chaque modification, je donne un nouvel ID à l'éducateur et j'indique son ancien ID, puis je rends inactif son ancien enregistrement.
 
Le premier enregistrement qui a été fait pour un éducateur a un ancien_id = 0.
 
On a par exemple les enregistrements suivants :
1, 0, DUPONT, Jean, (données diverses),0
14, 1, DUPONT, Jean, (données diverses modifiées),0
23, 14, DUPONT, Jean, (données diverses modifiées),0
31, 23, DUPONT, Jean, (données diverses modifiées),1
 
Ma question :  
Comment remonter l'historique des modification avec SQL ?
Je pensais faire un LOOP, mais j'arrive pas trop à saisir si le comportement et la syntaxe. Et puis, il me faudrait mettre à chaque fois l'ancien ID dans une variable.
 
Y'aurait bien une solution avec une boucle côté PHP, mais ça risque d'être un peu lourd pour le serveur de base de données...
 
Merci pour votre aide  [:petrus75]

Reply

Marsh Posté le 05-07-2014 à 13:42:49   

Reply

Marsh Posté le 07-07-2014 à 11:10:50    

C'est quand même pas top comme structure :/
J'aurais plutôt vu 2 tables :
L'une qui contient les données courantes, l'autre qui contient l'historique. Comme ça, t'as qu'un seul ID pour l'éducateur. Parce que je te dis pas le bazar si cet ID est utilisé comme clé étrangère dans d'autres tables et qu'il faille le changer pour mettre l'ID courant :/
 
Pour la table contenant l'historique, t'as le choix :
- soit elle a une structure similaire à celle contenant les données courantes, avec en plus, en clé étrangère, l'ID de l'éducateur. Facile pour récupérer l'historique mais grosse duplication de données identiques si très peu ont changé
- soit elle a une structure avec le nom du champ qui a changé (tu peux aussi le représenter par un enum ou une constante de type entier) et la valeur que le champ avait avant le changement + en clé étrangère, l'ID de l'éducateur. C'est un plus compliqué pour reconstituer l'historique mais t'as pas de duplication de donnée ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 07-07-2014 à 13:55:38    

Ah ouais je vois.
 
Effectivement, y a un raté là-dessus.
Ton idée de faire une table historique est bonne. Il va me falloir un script pour récupérer l'existant et le déplacer dans la table qui va bien...
 
Merci pour ton aide.
 
Je reste ouvert à d'autres idées.

Reply

Marsh Posté le 07-07-2014 à 15:11:45    

je confirme que c'est comme ça qu'il faut faire. en rajoutant une date de mise à jour si besoin.

Reply

Marsh Posté le 07-07-2014 à 15:32:39    

Effectivement, j'ai oublié de préciser qu'il fait un champ date, voire un champ date/heure mais bon, quand on parle d'historique, ça implique une notion d'horodatage en général...


Message édité par rufo le 07-07-2014 à 15:32:55

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 07-07-2014 à 15:37:19    

oui pas habitué à MySQL, en oracle un champ date contient forcément la date et l'heure ;)

Reply

Marsh Posté le 07-07-2014 à 21:30:59    

Okay.
 
Bon, je vais essayer de réorganiser mon bazar.
 
Merci à vous

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed