复合主键+外键(Composite Primary Key + Foreign Key)

2019-07-30 02:53发布

我有一个包含调查列表的表(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列的组合键。

我该如何去实现呢?

Answer 1:

是的你可以:

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)不是最好的主意。



Answer 2:

你的主键定义键和外键的定义是正交的。 你可以宣布你的复合主键,并没有问题,你的单列外键。 我建议你,虽然,在代理主键VariableMappings是更好的选择与组合键-专门为指向外键VariableMappings



Answer 3:

还有,做事项的一个主键,它是的SurveyMaster 。 只要ID是主键存在,则可以从任意数量的其他表的引用,而不管这些表主密钥。

外键要求,列引用组合是独特的,唯一性必须由主键约束保证,例如。



文章来源: Composite Primary Key + Foreign Key