Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie habe ich eine Check-Einschränkung, die auf eine andere Tabelle verweist?

Fügen Sie eine Spalte tblItem.ItemType hinzu. Diese Spalte kann (offensichtlich) nur einen Wert in einer bestimmten Zeile haben. Fügen Sie eine eindeutige Einschränkung über ItemID,ItemType.

hinzu

Jetzt der Trick:Nur wenige Leute erinnern sich daran, aber ein Fremdschlüssel kann auf die Spalten einer Unique-Einschränkung verweisen.

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) 
);

Wenn Sie ItemType in jeder der untergeordneten Tabellen auf einen festen Wert beschränken, kann auf eine bestimmte Zeile in tblItem nur von einer untergeordneten Tabelle verwiesen werden.

Es ist jedoch ein dreistufiger Prozess, um ein Element von gut zu schlecht zu ändern:

  1. Zeile aus tblGoodItem löschen
  2. Aktualisieren Sie den ItemType der Zeile in tblItem
  3. Zeile in tblBadItem einfügen