2012-06-26 298 views
2

我有一个包含调查列表的表(PK是ID)复合主键+外键

CREATE TABLE [dbo].[SurveyMaster](
    [ID] [nvarchar](4) NOT NULL, 
    [Title] [nvarchar](200) NULL, 
    [IsActive] [bit] NOT NULL, 

并包含变量映射列表的表。

CREATE TABLE [dbo].[VariableMappings](
    [ParentSurvey_ID] [nvarchar](4) NOT NULL, 
    [ReportingMonth] [nvarchar](6) NOT NULL, 
    [VariableName] [nvarchar](400) NOT NULL, 
    [Value] [int] NOT NULL 

我希望是创造VariableMappings上ParentSurvey_ID,ReportingMonth和变量名中的主键,以确保一个唯一的记录。

尽管如此,我想要获取VariableMappings.ParentSurvey_ID和SurveyMaster.ID之间的外键关系,以确保VariableMappings只包含相关的SurveyID。

我已经尝试了几种SQL Server中的方法,但我不相信我可以创建FK,因为组合键由3列组成。

我该如何去做到这一点?

回答

9

是的,你可以:

CREATE TABLE [dbo].[VariableMappings](
    [ParentSurvey_ID] [nvarchar](4) NOT NULL, 
    [ReportingMonth] [nvarchar](6) NOT NULL, 
    [VariableName] [nvarchar](400) NOT NULL, 
    [Value] [int] NOT NULL, 
    PRIMARY KEY (ParentSurvey_ID, ReportingMonth, VariableName), 
    FOREIGN KEY (ParentSurvey_ID) 
    REFERENCES dbo.SurveyMaster (ID) 
) ; 

晴无关你的问题,但有一个PRIMARY KEY就是这么宽(410个nvarchars)不是最好的主意。

+2

非常感谢。我认为我遇到的问题是通过SQL Server Management Studio使用GUI。 我明显需要学习如何更好地手工完成,谢谢。 – Tom

3

您的主键定义和外键定义是正交的。您可以声明组合主键和单列外键,而不会出现问题。不过,我建议您在VariableMappings上使用代理主键,而不是复合键 - 专用于指向VariableMappings的外键。

3

有一个重要的关键是重要的,它是SurveyMaster。只要ID是主键,您可以从任意数量的其他表中引用它,而不管这些表的主键。

外键要求引用的列的组合是唯一的,并且必须保证唯一性,例如通过主键约束。