Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como faço para ter uma restrição de verificação que se refere a outra tabela?


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:
  1. EXCLUIR linha de tblGoodItem
  2. UPDATE o ItemType da linha em tblItem
  3. INSERIR linha em tblBadItem