Dodaj kolumnę tblItem.ItemType. Ta kolumna może mieć tylko jedną wartość w danym wierszu (oczywiście). Dodaj unikalne ograniczenie dla ItemID,ItemType.
Teraz trik:niewiele osób to pamięta, ale klucz obcy może odwoływać się do kolumn unikalnego ograniczenia.
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)
);
Jeśli ograniczysz ItemType w każdej tabeli podrzędnej do stałej wartości, do danego wiersza w tblItem może odwoływać się tylko jedna tabela podrzędna.
Jest to trzyetapowy proces zmiany elementu z dobrego na zły:
- USUŃ wiersz z tblGoodItem
- AKTUALIZUJ typ elementu wiersza w tblItem
- WSTAW wiersz w tblBadItem