3

我有一个包含调查列表的表(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 和变量名称上为 VariableMappings 创建一个主键,以确保记录的唯一性。

同时,我想要 VariableMappings.ParentSurvey_ID 和 SurveyMaster.ID 之间的外键关系,以确保 VariableMappings 只包含相关的 SurveyID。

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

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

4

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

于 2012-06-26T20:41:53.073 回答
3

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

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

于 2012-06-26T20:41:53.143 回答
3

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

于 2012-06-26T20:38:43.287 回答