J'ai répondu trop rapidement, il y avait du rab, je complète donc :
J’ai supposé qu’un mot avait un sens, par exemple « artilleur », mais s’il n’y a pas d’utilité, on vire cet attribut.Envoyé par orygynz
MySQL Workbench ne permet pas de modéliser ce genre de contrainte, mais il est évident qu’il faudra rattraper le coup dans le code SQL, tout en étant conscient qu’avec des triggers, si on s’en sort avec n’importe quel SGBDR pour l’exclusion (X), il en va autrement pour la totalité (T). Dans ce 2e cas, on s’en sort péniblement à coup de DEFERRED (défini par la norme SQL, mais non pris en compte par MySQL), tandis que c’est très simple à assurer dans le cadre de la théorie relationnelle. En tout cas, avec MySQL c’est à garantir manuellement...Envoyé par orygynz
Par exemple, concernant l’exclusion, interdire l’ajout d’un mot pour une ligne de projet à laquelle on a déjà affecté un forfait ou une heure :
Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 CREATE TRIGGER MOT_EXCLUSION_TR BEFORE INSERT ON MOT FOR EACH ROW BEGIN SET @N = ( SELECT COUNT(*) FROM FORFAIT WHERE ClientId = NEW.ClientId AND ProjetId = NEW.ProjetId AND LigneProjetId = NEW.LigneProjetId ) ; IF @N > 0 THEN SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps un forfait.' ; END IF ; SET @N = ( SELECT COUNT(*) FROM HEURE WHERE ClientId = NEW.ClientId AND ProjetId = NEW.ProjetId AND LigneProjetId = NEW.LigneProjetId ) ; IF @N > 0 THEN SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps une heure.' ; END IF ; END ;
Le code est le même pour contrôler l’UPDATE (curieusement, MySQL exige un trigger supplémentaire). Il faut aussi coder les triggers interdisant qu’un forfait soit en même temps une heure ou un mot, etc.
P.-S. J’ai retrouvé la phrase complète à propos de l’artilleur :
« L’artilleur prit son fusil, épaula et tira la langue »
Bonne dimanchade !
Partager