Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso avere un vincolo di controllo che fa riferimento a un'altra tabella?

Aggiungi una colonna tblItem.ItemType. Questa colonna può avere un solo valore su una determinata riga (ovviamente). Aggiungi un vincolo univoco su ItemID, ItemType.

Ora il trucco:poche persone lo ricordano, ma una chiave esterna può fare riferimento alle colonne di un vincolo univoco.

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 vincoli ItemType in ciascuna delle tabelle figlio a un valore fisso, una determinata riga in tblItem può essere referenziata da una sola tabella figlio.

Tuttavia, è un processo in tre passaggi per modificare un elemento da buono a cattivo:

  1. CANCELLA riga da tblGoodItem
  2. UPDATE ItemType della riga in tblItem
  3. INSERIRE riga in tblBadItem