Přidejte sloupec tblItem.ItemType. Tento sloupec může mít v libovolném daném řádku pouze jednu hodnotu (samozřejmě). Přidejte jedinečné omezení přes ItemID,ItemType.
Nyní trik:málokdo si to pamatuje, ale cizí klíč může odkazovat na sloupce jedinečného omezení.
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)
);
Pokud omezíte ItemType v každé z podřízených tabulek na pevnou hodnotu, pak na daný řádek v tblItem může odkazovat pouze jedna podřízená tabulka.
Proces změny položky z dobré na špatnou se však skládá ze tří kroků:
- DELETE řádek z tblGoodItem
- UPDATE ItemType řádku v tblItem
- VLOŽTE řádek do tblBadItem