Adicione uma coluna tblItem.ItemType. Esta coluna pode ter apenas um valor em qualquer linha (obviamente). Adicione uma restrição exclusiva sobre ItemID,ItemType.
Agora o truque:poucas pessoas se lembram disso, mas uma chave estrangeira pode referenciar as colunas de uma restrição exclusiva.
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 você restringir ItemType em cada uma das tabelas filhas a um valor fixo, uma determinada linha em tblItem poderá ser referenciada por apenas uma tabela filha.
No entanto, é um processo de três etapas para alterar um item de bom para ruim:
- EXCLUIR linha de tblGoodItem
- UPDATE o ItemType da linha em tblItem
- INSERIR linha em tblBadItem