Ajoutez une colonne tblItem.ItemType. Cette colonne ne peut avoir qu'une seule valeur sur une ligne donnée (évidemment). Ajoutez une contrainte unique sur ItemID, ItemType.
Maintenant l'astuce :peu de gens s'en souviennent, mais une clé étrangère peut référencer les colonnes d'une contrainte unique.
CREATE TABLE tblItem (
ItemID INT PRIMARY KEY,
ItemType CHAR(1),
UNIQUE KEY (ItemID, ItemType)
);
CREATE TABLE tblGoodItem (
ItemID INT PRIMARY KEY,
ItemType CHAR(1),
CHECK (ItemType='G')
FOREIGN KEY (ItemID, ItemType) REFERENCES tblItem(ItemID, ItemType)
);
CREATE TABLE tblBadItem (
ItemID INT PRIMARY KEY
ItemType CHAR(1),
CHECK (ItemType='B')
FOREIGN KEY (ItemID, ItemType) REFERENCES tblItem(ItemID, ItemType)
);
Si vous contraignez ItemType dans chacune des tables enfants à une valeur fixe, une ligne donnée dans tblItem ne peut être référencée que par une seule table enfant.
Il s'agit cependant d'un processus en trois étapes pour modifier un élément de bon à mauvais :
- SUPPRIMER la ligne de tblGoodItem
- METTRE À JOUR le type d'élément de la ligne dans tblItem
- INSÉRER une ligne dans tblBadItem