[MySQL] Ajouter un nombre à une colonne null

Ajouter un nombre à une colonne null [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 07-10-2019 à 17:00:05    

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!

Reply

Marsh Posté le 07-10-2019 à 17:00:05   

Reply

Marsh Posté le 07-10-2019 à 17:02:31    

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


---------------
D3
Reply

Marsh Posté le 07-10-2019 à 17:11:35    

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!

Reply

Marsh Posté le 08-10-2019 à 21:56:03    

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

Reply

Marsh Posté le 09-10-2019 à 11:56:05    

+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
Reply

Marsh Posté le 09-10-2019 à 13:12:26    

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


---------------
D3
Reply

Marsh Posté le 09-10-2019 à 15:15:23    

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
Reply

Marsh Posté le 14-10-2019 à 18:58:39    

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

Reply

Sujets relatifs:

Leave a Replay

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