复合主键+外键

时间:2012-06-26 20:34:53

标签: sql database sql-server-2008

我有一张表,其中包含一份调查清单(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

我希望在ParentSurvey_ID,ReportingMonth和Variable Name上为VariableMappings创建一个主键,以确保唯一的记录。

与此同时,我想在VariableMappings.ParentSurvey_ID和SurveyMaster.ID之间建立外键关系,以确保VariableMappings仅包含相关的SurveyID。

我在SQL Server中尝试了几种方法,但由于复合键由3列组成,我不相信我可以创建FK。

我怎样才能实现这个目标?

3 个答案:

答案 0 :(得分: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)并不是最好的主意。

答案 1 :(得分:3)

您的主键定义和外键定义是正交的。您可以毫无问题地声明复合主键和单列外键。不过,我建议你VariableMappings上的代理主键是更好的选择而不是复合键 - 特别是对于指向VariableMappings的外键。

答案 2 :(得分:3)

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

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