过滤外键

And*_*ill 3 foreign-key sql-server subtypes

我有两个表:

  • 联系人(ID,类型);

  • 地址(ID)。

是否可以定义从地址(ID,'A')到联系人(ID,类型)的外键?

ype*_*eᵀᴹ 8

假设您要实现两个表之间的超类型/子类型关系(anAddress是 a Contact),您可以使用具有固定值的列'A'并将其用作外键:

CREATE TABLE Contact
  ( ID INT NOT NULL IDENTITY,
    Type VARCHAR(10) NOT NULL,
    PRIMARY KEY (ID, Type)
  ) ;
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE Address
  ( ID INT NOT NULL,
    Type  VARCHAR(10) NOT NULL DEFAULT 'A',
    CHECK (Type = 'A'),
    PRIMARY KEY (ID, Type),
    FOREIGN KEY (ID, Type)
      REFERENCES Contact (ID, Type)
  ) ;
Run Code Online (Sandbox Code Playgroud)

或者,我们可以Type在 Address 中声明为持久计算列(那时不需要检查约束):
Type AS CAST('A' AS varchar(10)) PERSISTED

CREATE TABLE Address
  ( ID INT NOT NULL,
    Type AS CAST('A' AS varchar(10)) PERSISTED NOT NULL,
    PRIMARY KEY (ID, Type),
    FOREIGN KEY (ID, Type)
      REFERENCES Contact (ID, Type)
  ) ;
Run Code Online (Sandbox Code Playgroud)