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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Ajouter un nombre à une colonne null

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Ajouter un nombre à une colonne null

n°2339889
Furaxx
Posté le 07-10-2019 à 17:00:05  profilanswer
 

Bonjour,
 
J'ai une table "OP" proposant en résumé comme champs:
- Id
- Nom
- hoursMax, qui par défaut est null
 
J'ai une autre table de bons de commande "OP_BC":
- Id
- op_id -> ID de l'OP auquel il est lié
- hours
 
Lorsque je crée ou que je modifie un enregistrement de "OP_BC", je souhaiterais que le "heureMax" de OP se mette à jour en fonction.
Je crée un enregistrement dans OP_BC de 100h, je souhaites que heuresMax de l'OP correspondant prenne 100h de plus.
 
J'ai pour ça fait des triggers:
 

Code :
  1. CREATE TRIGGER `opbc_after_insert` AFTER INSERT ON `op_bc`
  2. FOR EACH ROW UPDATE
  3. op
  4. SET
  5. op.hoursMax = op.hoursMax + NEW.hours
  6. WHERE
  7. op.id = NEW.op_id


 

Code :
  1. CREATE TRIGGER `opbc_after_update` AFTER UPDATE ON `op_bc`
  2. FOR EACH ROW UPDATE
  3. op
  4. SET
  5. op.hoursMax = op.hoursMax - OLD.hours + NEW.hours
  6. WHERE
  7. op.id = NEW.op_id


 
Seul problème, c'est que le nombre d'heures est modifié uniquement si la valeur de "hoursMax" n'est pas égale à null. Si elle est à null alors rien n'est fait.
J'ai testé la requête en direct et ça m'a confirmé la chose: null+100 = null
 
Mettre hoursMax à 0 par défaut résout le problème mais avoir null m'arrange plus pour l'affichage ensuite, ça me fait une condition de moins à mettre s'il n'y a pas d'heures max renseignées. Sachant qu'en plus mettre la valeur "0" veut dire "0 heures max" et pas "pas d'heure renseignée".
 
Bref, comment puis-je résoudre ce problème?
 
Par avance merci!

mood
Publicité
Posté le 07-10-2019 à 17:00:05  profilanswer
 

n°2339890
mechkurt
Posté le 07-10-2019 à 17:02:31  profilanswer
 

Ça doit pouvoir se gérer avec un CASE :
https://dev.mysql.com/doc/refman/5.7/en/case.html


---------------
D3
n°2339891
Furaxx
Posté le 07-10-2019 à 17:11:35  profilanswer
 

Alors, je cherche depuis je ne sais combien de temps et il suffit que je poste la demande pour avoir quelque chose qui m'a l'air de fonctionner… :D
 

Code :
  1. CREATE TRIGGER `opbc_after_insert` AFTER INSERT ON `op_bc`
  2. FOR EACH ROW UPDATE
  3. op
  4. SET
  5. op.hoursMax = IF(op.hoursMax IS NULL, NEW.hours, op.hoursMax+NEW.hours)
  6. WHERE
  7. op.id = NEW.op_id


 

Code :
  1. CREATE TRIGGER `opbc_after_update` AFTER UPDATE ON `op_bc`
  2. FOR EACH ROW UPDATE
  3. op
  4. SET
  5. op.hoursMax = IF(op.hoursMax IS NULL, NEW.hours, op.hoursMax - OLD.hours + NEW.hours)
  6. WHERE
  7. op.id = NEW.op_id


 
Je ne passe pas par un CASE comme tu le proposes mais je suppose que ça doit marcher pareil au final.
Bref, je dois faire 2-3 tests pour être certain que c'est bon, et si vous passez par là, vous pourrez me dire si c'est bon ou pas ma méthode. :)
 
Merci!

n°2339932
mrbebert
Posté le 08-10-2019 à 21:56:03  profilanswer
 

Il y a la fonction IFNULL() qui devrait faire le job : IFNULL(val1, val2) renvoie val1 si non null, val2 sinon.
Donc l'addition va s'écrire :
  op.hoursMax = IFNULL(op.hoursMax, 0) + NEW.hours

n°2339942
rufo
Pas me confondre avec Lycos!
Posté le 09-10-2019 à 11:56:05  profilanswer
 

+1 pour la fonction IFNULL plus appropriée qu'un trigger ou un case à mon avis.


---------------
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
n°2339945
mechkurt
Posté le 09-10-2019 à 13:12:26  profilanswer
 

Je connaissais pas et effectivement c'est la solution la plus élégante !


---------------
D3
n°2339959
rufo
Pas me confondre avec Lycos!
Posté le 09-10-2019 à 15:15:23  profilanswer
 

Le case, c'est bien quand t'as plus que 2 cas (IF/ELSE).


---------------
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
n°2340240
Furaxx
Posté le 14-10-2019 à 18:58:39  profilanswer
 

Je ne connaissais pas non plus ce IFNULL, merci beaucoup!


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

  [MySQL] Ajouter un nombre à une colonne null

 

Sujets relatifs
CSS - Retour en haut de colonne[Python] Exercice nombre premiers et fonction seuil
[MySQL] Extraction de champs Jsonmessage d'alerte après un tri sur la colonne
[MySQL] Champs Json, ordre non gardé[MySQL] - Sélection d'un relevé du mois précédent
[résolu] Tester si un evariable est bien une connexion Mysql ?[MySQL] - Sélectionner enregistrements qui ne sont pas ailleurs
[MySQL] Nombre de cours et exercices avec une seules requête 
Plus de sujets relatifs à : [MySQL] Ajouter un nombre à une colonne null


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