Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 多列外键,带硬编码参考值_Sql Server_Sql Server 2014 - Fatal编程技术网

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

Sql server 多列外键,带硬编码参考值,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我有一个ValidationStatus表,其中包含以下(主键)列: 可以在地址表和这个表之间建立外键吗 具体而言,每个地址都有一个验证状态;如果我能硬编码文本,它将是: ALTER TABLE dbo.Addresses ADD CONSTRAINT FK_Addresses_ValidationStatus FOREIGN KEY('ADDRESS', ValidationStatus) REFERENCES dbo.ValidationStatus(Attribut

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

可以在地址表和这个表之间建立外键吗

具体而言,每个地址都有一个验证状态;如果我能硬编码文本,它将是:

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

你不能那样做。解决方案正在更改设计,如下所示:

  • 向dbo.ValidationStatus添加标识或唯一整数
  • 为指向新整数字段的点创建外键

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

    ALTER TABLE dbo.Address
    ADD CHECK (ValidationStatus in (1,2,3,4))
    
  • 这样,您将使用外键的优点

    另一种方法是使用两个不同的状态表并使用一个简单的FK

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

    另一种方法是使用字符和数字的组合,如A1、A2、A3、A4表示地址状态,E1、E2等表示电子邮件状态。对于每个新实体,您需要选择一个字符。在这种情况下,您可以使用一个简单的FK,而不需要多个表

    ALTER TABLE dbo.Address
    ADD CHECK (ValidationStatus in (1,2,3,4))