Добавете колона tblItem.ItemType колона. Тази колона може да има само една стойност на даден ред (очевидно). Добавете уникално ограничение върху ItemID, ItemType.
Сега трикът:малко хора си спомнят това, но външен ключ може да препраща към колоните на уникално ограничение.
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)
);
Ако ограничите ItemType във всяка от дъщерните таблици до фиксирана стойност, тогава даден ред в tblItem може да бъде препратен само от една дъщерна таблица.
Това обаче е процес в три стъпки за промяна на елемент от добър на лош:
- ИЗТРИВАНЕ на ред от tblGoodItem
- АКТУАЛИЗИРАНЕ на ItemType на реда в tblItem
- ВМЪКНЕТЕ ред в tblBadItem