sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo tengo una restricción de verificación que se refiere a otra tabla?

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:

  1. ELIMINAR fila de tblGoodItem
  2. ACTUALIZAR el tipo de elemento de la fila en tblItem
  3. INSERTAR fila en tblBadItem