Aggiungi una colonna tblItem.ItemType. Questa colonna può avere un solo valore su una determinata riga (ovviamente). Aggiungi un vincolo univoco su ItemID, ItemType.
Ora il trucco:poche persone lo ricordano, ma una chiave esterna può fare riferimento alle colonne di un vincolo univoco.
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)
);
Se vincoli ItemType in ciascuna delle tabelle figlio a un valore fisso, una determinata riga in tblItem può essere referenziata da una sola tabella figlio.
Tuttavia, è un processo in tre passaggi per modificare un elemento da buono a cattivo:
- CANCELLA riga da tblGoodItem
- UPDATE ItemType della riga in tblItem
- INSERIRE riga in tblBadItem