Agregue una columna tblItem.ItemType. Esta columna solo puede tener un valor en cualquier fila dada (obviamente). Agregue una restricción única sobre ItemID, ItemType.
Ahora el truco:pocas personas recuerdan esto, pero una clave externa puede hacer referencia a las columnas de una restricción única.
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 restringe ItemType en cada una de las tablas secundarias a un valor fijo, solo una tabla secundaria puede hacer referencia a una fila determinada en tblItem.
Sin embargo, cambiar un elemento de bueno a malo es un proceso de tres pasos:
- ELIMINAR fila de tblGoodItem
- ACTUALIZAR el tipo de elemento de la fila en tblItem
- INSERTAR fila en tblBadItem