CREATE TABLE GAMME
(
gammeId INT,
gammeNom VARCHAR(50) NOT NULL,
CONSTRAINT GAMME_PK PRIMARY KEY(gammeId)
);
CREATE TABLE PRODUIT
(
produitId INT,
produitNom VARCHAR(50) NOT NULL,
gammeId INT NOT NULL,
CONSTRAINT PRODUIT_PK PRIMARY KEY(produitId),
CONSTRAINT PRODUIT_GAMME_FK FOREIGN KEY(gammeId) REFERENCES GAMME(gammeId)
);
CREATE TABLE COULEUR
(
couleurId INT,
couleurNom VARCHAR(50) NOT NULL UNIQUE,
CONSTRAINT COULEUR_PK PRIMARY KEY(couleurId)
);
CREATE TABLE TAILLE
(
tailleId INT,
taille DECIMAL(4,2) NOT NULL UNIQUE,
CONSTRAINT TAILLE_PK PRIMARY KEY(tailleId)
);
CREATE TABLE PRODUIT_TAILLE
(
tailleId INT,
produitId INT,
poids DECIMAL(4,2) NOT NULL,
CONSTRAINT PRODUIT_TAILLE_PK PRIMARY KEY(tailleId, produitId),
CONSTRAINT PRODUIT_TAILLE_TAILLE_FK FOREIGN KEY(tailleId) REFERENCES TAILLE(tailleId),
CONSTRAINT PRODUIT_TAILLE_PRODUIT_FK FOREIGN KEY(produitId) REFERENCES PRODUIT(produitId)
);
CREATE TABLE PRIX
(
tailleId INT,
couleurId INT,
prix INT NOT NULL,
reference VARCHAR(48) NOT NULL,
CONSTRAINT PRIX_PK PRIMARY KEY(tailleId, couleurId),
CONSTRAINT PRIX_TAILLE_FK FOREIGN KEY(tailleId) REFERENCES TAILLE(tailleId),
CONSTRAINT PRIX_COULEUR_FK FOREIGN KEY(couleurId) REFERENCES COULEUR(couleurId)
);
CREATE TABLE PRODUIT_PRIX
(
tailleId INT,
couleurId INT,
tailleId_1 INT,
produitId INT,
CONSTRAINT PRODUIT_PRIX_PK PRIMARY KEY(tailleId, couleurId, tailleId_1, produitId),
CONSTRAINT PRODUIT_PRIX_PRIX_FK FOREIGN KEY(tailleId, couleurId) REFERENCES PRIX(tailleId, couleurId),
CONSTRAINT PRODUIT_PRIX_PRODUIT_TAILLE_1_FK FOREIGN KEY(tailleId_1, produitId) REFERENCES PRODUIT_TAILLE(tailleId, produitId)
);
Mais on constate que la structure de la table PRODUIT_PRIX comporte une redondance des colonnes tailleId et tailleId_1, et au lieu d’établir une contrainte pour garantir que les valeurs prises par ces colonnes soit strictement les mêmes (trigger en perspective...), le plus simple est d’en virer une, d’où les ALTER TABLE, permettant de procéder au réglage du tir (noter la structure correcte cette fois-ci de la clé primaire) :ALTER TABLE PRODUIT_PRIX
DROP CONSTRAINT PRODUIT_PRIX_PRODUIT_TAILLE_1_FK
, CONSTRAINT PRODUIT_PRIX_PK
, COLUMN tailleId_1 ;
ALTER TABLE PRODUIT_PRIX
ADD CONSTRAINT PRODUIT_PRIX_PK
PRIMARY KEY(tailleId, couleurId, produitId)
, CONSTRAINT PRODUIT_PRIX_PRODUIT_TAILLE_FK
FOREIGN KEY(tailleId, produitId)
REFERENCES PRODUIT_TAILLE(tailleId, produitId) ;
En passant, cette façon de procéder vaut dans le cas général, c’est-à-dire quand des classes d’entités sont impliquées dans une boucle (TAILLE, PRODUIT_TAILLE, PRIX dans le cas présent), c’est-à-dire virer une des deux colonnes redondantes.