多列外键,带有硬编码参考值

时间:2016-02-08 02:47:46

标签: sql-server sql-server-2014

我有一个ValidationStatus表,其中包含以下(主键)列:

Attribute   Code
ADDRESS INVALID
ADDRESS REFUTED
ADDRESS STORE
ADDRESS VERIFIED
EMAIL   INVALID
EMAIL   REFUTED
EMAIL   STORE
EMAIL   UNKNOWN
EMAIL   VALID
EMAIL   VERIFIED

是否可以在地址表和此地址表之间建立外键?

具体来说,每个地址都有一个验证状态;如果我能对文本进行硬编码,那就是:

ALTER TABLE dbo.Addresses
    ADD CONSTRAINT FK_Addresses_ValidationStatus
    FOREIGN KEY('ADDRESS', ValidationStatus)
    REFERENCES dbo.ValidationStatus(Attribute, Code)

1 个答案:

答案 0 :(得分:1)

你不能那样做。解决方案是改变设计如下:

  1. 向dbo.ValidationStatus
  2. 添加标识或唯一整数
  3. 创建指向新整数字段的外键

    ALTER TABLE dbo.Addresses
    ADD CONSTRAINT FK_Addresses_ValidationStatus
    FOREIGN KEY(ValidationStatus)
    REFERENCES dbo.ValidationStatus(NewUniqueField)
    
  4. 向Address表添加约束以限制地址验证范围的范围。对于此示例,假设您的地址验证是1,2,3和4.因此创建一个检查约束,如

    ALTER TABLE dbo.Address
    ADD CHECK (ValidationStatus in (1,2,3,4))
    
  5. 这样您就可以使用外键的好处。

    另一种方法是拥有2个不同的状态表并使用简单的FK。

    注意:在第一种方法中,如果您有新状态,则必须记住更改检查约束。

    另一种方法是使用字符和数字组合(如A1,A2,A3,A4)进行地址状态,使用E1,E2等进行电子邮件状态的组合。对于每个新的entiry你需要选择一个角色。在这种情况下,你可以拥有一个简单的FK而不需要多个表。